Ответы пользователя по тегу Standard Template Library
  • Что не так с кодом, проверяющим логическую схему?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Во-первых, у вас цикл от 0 до 32 включительно. Т.е. вы на последней, 33-ей итерации пытаетесь преобразовать 0b100000 в bitset, фактически, второй раз учитывая вариант со всеми нолями. Вот почему вы получаете 33 а не 32.

    Во-вторых, у вас ошибка с тем, что вы из bitmask берете биты, которые есть числа 0 и 1 и проводите над ними битовые операции, а не логические. И это у вас там 32-битные числа же! Для | и & оно еще совпадает с вашими ожиданиями, а вот ~ обращает ВСЕ 32 бита числа.

    Поэтому ~(bitset[E] | bOrD) всегда выдаст или -1 или -2. Вы потом это пропустите через or, получите опять же -1 или -2 и в конце преобразуете это в bool. И вот тут-то оно всегда и станет true.

    Чтобы это исправить, или используйте логические операции (||, &&, !), или вместо ~x используйте x^1, или в самом конце возвращайте результат с &1, чтобы значения остальных бит ни на что не влияли.
    Ответ написан
    5 комментариев
  • Как конвертировать steady_clock::time_point в system_clock::time_point и наоборот?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Достоверно - никак.
    Можно попробовать получить значение двух часов рядом и взять разницу между ними как сдвиг. Но тут будет какая-то минимальная ошибка из-за задержки между двумя вызовами. И, если пользователь поменяет часовой пояс в настройках системы, system_clock скакнет на несколько часов, поэтому надо по уму делать эту операцию каждый раз, когда вы хотите перевести одни часы в другие. И это дорого.

    Вообще, если вам надо эти двое часов переводить в друг друга, то вы что-то не так делаете.
    Ответ написан
    Комментировать
  • Почему возникает ошибка?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В find_in_nodes_by_name у вас return закомментирован. Это первая ошибка.

    По второй ошибке: попробуйте написать LinearNavigation<T>::haveNext() там, где оно вызывается в isFullyConnectedQuad.

    Эта ошибка возникает из-за хитросплетения стандарта С++. Ну вот не ищет компилятор вот такие функции не завсящие от шаблонного аргумента по всем шаблонам. Замучается искать, на самом деле, если бы это было включено всегда.
    Ответ написан
  • Почему возникает эта ошибка?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Надо смотреть, что там get_childrens возвращает. Судя по ошибке, там где-то замешаны unique_ptr, которые нельзя просто копировать.

    Подозреваю, что ошибка исправится, если в for сделать item ссылкой.
    Ответ написан
    1 комментарий
  • Как определить тип функции для шаблона?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Можно использовать typedef int value_type; в классе с Setter/Getter.

    Тогда в вашем шаблоне вы можете использовать C::value_type. Так в STL, например, сделано.

    Плюсы: не надо обязательно заводить n. Можно обзывать его как удобнее или оно может вообще иметь другой тип, если свойство хранится неявно.

    Минусы: Надо обязательно заводить этот самый value_type и обновлять его вместе с методами Getter/Setter.
    Ответ написан
  • Не получается найти пересечения multiset, в чем проблема?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Проблема в том, что итераторы unordered_set - имеют тип ForwardIterator. Варианты set_intersection, которые ждут вот такой вот итератор для результата, еще хотят и ExecutionPolicy.

    Но даже если вы поменяете тип у intersect, чтобы туда можно было вставлять ответ, ваш код не сработает, потому что set_intersection ждет упорядоченные интервалы. Вас unordered в названии контейнеров не смущает?
    Ответ написан
    Комментировать
  • Как добавить в `std::map` объект с константными полями?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Храните в std::map указатели на ваш тип. Лучше умные, вроде shared_ptr.
    Ответ написан
  • Как создать свой итератор для вектора в шаблонном классе?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вам, собственно, надо реализовать итератор для вашего класса и возвращать итараторы в begin() и end(). Вот первая статья из гугла, в которой по шагам реализуют итератор.

    Вам надо лишь переписать операторы инкримента, чтобы пропускать элементы. Ну и аккуратно считать итератор end, чтобы последовательные инкрименты из begin не проскочили его.
    Ответ написан
    Комментировать
  • Почему максимальный размер объекта std::string равен 4611686018427387897?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Ну вот просто создатели библиотеки захардкодили именно это число.
    Эта конструкция возвращает разные значения, в зависимости от компилятора, разрядности, опреационной системы.

    Это 2^62-7. Почему 2^62? Может, в силу каких-то причин в вашей системе нельзя адресовать больше 62 бит. Может, система 2 бита для чего-то использует. Почему -7? Надо еще где-то хранить длину, надо оставить место для нулевого символа в конце и надо оставить нетронутым индекс std::string::npos - это значение используется для обозначения "несуществующего индекса". Конкретное значение зависит от того, что там программисты стандартной библиотеки сделали.

    В любом случае, это значение на много-много порядков больше любой практически возможной длины строки. Ну не сможете вы выделить 4 экзобайта памяти.
    Ответ написан
    Комментировать