• Как в указатель на базовый класс вложить ссылку на класс наследник?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Правильно - вот так:
    object = new Kvadrat();

    Теоретически, можно было бы делать как вы пытаетесь:
    object = &kv;

    Но конкретно в вашем коде - это будет UB, потому что kv - это локальная переменная и у нее очень огранниченная область видимости - внутри if. И вот за пределеами этого if, где вы и попытаетесь, очевидно, использовать указатель object, эта локальная переменная будет уже уничтожена. У вас будет т.н. висячий указатель - указывающий туда, где данные были, а сейчас там может быть все, что угодно.

    Поэтому, если вы присваиваете указателю адрес какого-то объекта (&) вам надо убедиться, что время его жизни не меньше, чем у указателя, пока вы будете его использовать. Можно, например, сделать переменную глобальной, но это очень плохой код. Лучше завести все 4 разных класса в начале функции, потом прочитать нужный и взять указатель на него. Этот подход иногда даже используется на практике.

    Но лучше, все-таки, не плодить лишних сущностей и создавать объект сразу в куче с помощью new. Тогда он сам нигде не уничтожится.
    Ответ написан
    1 комментарий
  • Как написать такое при помощи AVX?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Каким-нибудь _mm256_cmpgt_epi16 два раза можно получить для каждого числа 0xFFFF, если оно входит в интервал и 0 иначе. Потом каким-нибудь _mm256_and_si256 можно занулить те числа, которые не попали. Возможно, придется делать and 2 раза.
    Ответ написан
    5 комментариев
  • Как исправить ошибку "unsorted double linked list corrupted"?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Это проблема работы с памятью. Вы там освобождаете память из-под str перед тем, как попросить gmp заполнить эту строку данными:
    free(str);
    mpz_get_str (str,10 , mul);


    gmp пишет данные туда, где была строка. Но в это место нельзя писать после free. Иногда так получается. что менеджер памяти хранит там какие-то свои данные, которые вы портите и потом получаете об этом ошибку. Память может быть возвращена системе, и тогда программа может упасть вообще при попытке записать туда что-то. Или ничего заметного может не произойти вообще.

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В документации есть пример:
    std::thread t5(&foo::bar, &f); // t5 runs foo::bar() on object f


    У вас надо cделать: std::thread t5(&A::Zoom, this);
    Ответ написан
    Комментировать
  • Найти пары слов связанных с 4ми и более одинаковыми url?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Во-первых, я бы с помощью бора все урлы перенумеровал. Теперь в задаче есть 400,000 ключевых слов, связанных с 10-ю числами.

    Далее, В каждой группе по 10 чисел есть 10!/4!/6! = 840 четверок. Всего различных четверок наберется 840*400000 ~= 330,000,000. Это не так много. Для хранения всей этой радости, правда, понадобится ~8 гигабайт памяти, но это подъемно. Потом вам надо среди этих 300 миллионов найти совпадающие. Можно отсортировать (лучше радиксом) или воспользоваться хеш таблицей (правда тут еще больше памяти потребуется).

    Это будет на много порядков быстрее сравнивания каждого слова с каждым или перебор 4-х урлов.
    Все за несколько секунд должно отработать.
    Ответ написан
    1 комментарий
  • Что означают эти формулы?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    "E" (это вообще-то сигма из греческого алфавита) - знак суммы. выражение справа надо просуммировать, подставив вместо k все числа от 3 до n. П - это знак произведения. Выражение справа надо перемножить для всех указанных значений i.

    Поскольку тут в выражении П есть переменная k, связанная в сигме, то можно однозначно сказать, что перемножение идет внутри суммы.

    Ваше решение в вопросе почти правильное. Проблема только в том, что вам надо подсчитать что-то вроде c1*a1*a2*a3 + c2*b1*b2*b3. А вы используете одну и ту же переменную для подсчета каждого слагаемого и общей суммы. У вас получается что-то вроде (c1*a1*a2*a3+c2)*b1*b2*b3
    Ответ написан
    2 комментария
  • Почему выводится другое значение вместо ожидаемого?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Очевидно, потому что оператор value++ (вместе с square) выполнился раньше оператора сдвига <<, которые используются для вывода в поток cout.

    Вообще, у меня оно выводит 13.

    Стандарт гарантирутет, что постинкримент сработает после того, как значение пременной возьмется для вычисления выражения, а вот когда именно во время вычисления этого выражения - это уже от компилятора зависит.

    Вообще, использование переменной value в том же выражении, что и она же с постинкриментом - Undefined behavior.

    Мне лень искать конкретные пункты стандарта, из которых будет следовать, что это UB, но просто запомните: нельзя использовать перменную и переменную++ в одном и том же выражении.
    Ответ написан
    3 комментария
  • Если мы возьмём кубическую кривую Безье и вытянем усы в одну точку, будет ли это квадратичная кривая?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Нет. Потому что кривая называется "кубической" не потому, что там 4 разные точки, а потому что она задается уравнением третьей степени (кубы): a(1-t)^3+bt(1-t)^2+ct^2(1-t)+dt^3. Если вы приравняете b и c, то уравнение так и останется кубическим и в квадртаичное не превратится.
    Ответ написан
  • Сортировка расческой. Что такое число 1.247?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Судя по всему, это число вылезло в результате эксперементов каких-то исследователей. Они просто попробовали кучу разных факторов и нашли что при 1.247 вроде как быстрее в среднем. Формулу по это число потом какой-то шутник придумал. Кроме как в русской википедии (без ссылки на источник) я нигде эту формулу найти не могу.

    Влияет оно так: если число слишком большое, то мелкие элементы в конце массива не успевают перехать в начало на итерациях с достаточно большим шагом; если же число слишком мелкое, то делается много лишних итераций.
    Ответ написан
    Комментировать
  • Как решить эту задачу на python?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Вам надо в цикле считать члены ряда вот по той вот формуле из условия, подставляя вместо n числа 1,2 и т.д.
    Если текущий член стал меньше заданной границы, то надо выйти из цикла. Иначе прибавить к переменной.

    Похоже, предполагается, что следующий член будет вычисляться через предыдущий.
    Ответ написан
    Комментировать
  • Какой самый быстрый алгоритм поиска в массиве непересекающихся отрезков, поиск отрезка внутри которого лежит точка?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Если нет простой формулы, как в линейном случае (например, логарифм или корень числа), то за О(1) можно только если числа не очень большие: надо предподсчитать ответы для всех возможных индексов.

    Если запросов много (больше чем отрезков) и они уже сортированные, то можно обработать их все сразу пачкой, пройдясь один раз по массиву отрезков. Это будет быстрее чем за логарифм обрабатывать каждый запрос отдельно. Но это очень частный случай. Сортировать запросы будет медленнее бинпоиска, если они уже не даны по порядку.

    Если запрос только один, то можно не париться, ибо время на загрузку массива с отрезками вы уже потратили и вся программа уже точно O(n) как минимум.
    Ответ написан
    Комментировать
  • Как использовать getline с файлом?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Открывайте файл через ifstream (или wifstream).
    Вот эту вот штуку и передавайте вместо wcin.
    Ответ написан
    Комментировать
  • Где на практике применяются комплексные числа? В каких сферах IT они нужны?

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

    Но вообще, комплексные числа, группы и кольца очень часто используются в криптографии, намример. Сами алгоритмы шифрования и обмена ключами (всякие там RSA, Diffie-Hellman) - это вообще часто чистая математика с этими объектами. Плюс, комлпексные числа используются в быстром преобразовании Фурье, которое позволяет быстро перемножать огромные числа, а эта операция в криптографии тоже очень важна.
    Ответ написан
    Комментировать
  • Как эффективно хранить неопределенное количество разных типов данных?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Ну, без дырок совсем не получится. Во-первых, сами структуры могут быть с дырками из-за выравнивания. Потом, не любой тип можно положить куда угодно, опять же, из-за выравнивания. Далее, при удалении будут образовываться дырки, которые не факт что и можно заполнить (без медленного перелопачивания всей структуры).

    Евгений Шатунов правильно говорит, что это уже алгоритм аллокатора получается, а не структура данных. Ну а дальше, можно как-то выделять сырую память под ваши элементы, и в соседнем векторе указателей хранить где будет лежать i-ый элемент для быстрого доступа.
    Ответ написан
  • Что возвращает return в С++?

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

    Советую всем программистам на C++ хотябы почитать про ассемблер.
    Стек, регистры, вот это вот все. Тогда станет понятно, как работает процессор.

    Тогда станет понятно что "сам объект tmp" никак не вернуть. Это локальная переменная, лежащая на стеке в части, которая будет отброшена при выходе из функции. Отсюда вытекает, что вообще говоря, там должна быть копия.

    Но есть такая оптимизация, как RVO. В стандарте даже прописано, когда конкретно она гарантирована. Тогда копии не происходит. При этом компилятор вообще не создает локальной переменной. А вместо этого сразу же работает с тем местом, куда надо будет возвращать значение.

    Если код и включенные оптимизации позволяют это сделать - то копии не будет. Но в общем случае - будет копия.
    Ответ написан
    Комментировать
  • Как устроены хэштаблицы?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Сначала выделяется массив какого-то размера, например 256. Обычно длина - степень двойки. Потом хеш обрезается до размера таблицы. Если элементов становится слишком много, то происходит перехеширование - размер таблицы увеличивается, и все элементы в нее перезапихиваются.

    Но да, если в таблицу запихать много элементов, а потом почти все оттуда удалить, то она будет большая и почти вся пустая.

    Edit:

    Эта "проблема" никак не решается. Это и не проблема вовсе. Просто хеш-таблицы работают быстрее всяких балансированных деревьев или тупо сортированного массива за счет большего расхода памяти. Это нужно знать и дальше уже решать - что вам больше подходит под вашу конкретную задачу.
    Ответ написан
    Комментировать
  • Как записать формулу на c++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вам понадобятся стандартные функции log, abs, sqrt.

    Дальше вам остается только скомбинировать как записано в задании.
    Ответ написан
    Комментировать
  • Как работает long long int в C++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Это просто 64 битный (обычно) тип. Сейчас процессоры умеют работать с такими числами напрямую, без "склеивания" двух 32 битных чисел.
    Ответ написан
    4 комментария
  • Как сделать так чтоб в консоли кода можно было водить градусы?

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

    Ничем. В консоли можно вводить только числа. А вот что за единицы измерения у этих чисел - это уже вам решать, как их интерпретировать. Хотите, чтобы введенное число было градусами - ну так просто интерпретируйте его как градусы (еще хорошо бы переменную назвать так, чтобы по названию была видна единица измерения. Например angle_deg).

    Со вводом разобрались. Осталось интерпретировать переменную как градусы. Как к ней прибавить 45 градусов? Как к 2 яблокам прибавить 3 яблока и получить 5 яблок? Градусы с градусами можно складывать точно так же. Тупо прибавьте 45 к числу в переменной.

    Далее, у вас там есть вызов тригонометрической функции cos. Читайте справку: в каких единиах измерения функция принимает углы? В радианах. А у вас угол в градусах. Поэтому надо перевести градусы в радианы и результат уже передавать в cos. Как это сделать? Спросите у гугла - он вам формулу напишет прямо над результатами поиска. Пи, которое вам понадобится при переводе, уже есть в стандартной библиотеке.
    Ответ написан
    Комментировать
  • Как правильно передавать QByteArray по двойной ссылке в функцию?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Ошибка
    Call to non-static member function without an object argument


    Если добавить static, сами уже проверили - ошибка исчезает:
    static void FileModifier::writeFile(QByteArray&& fileDataBuf)


    Внезапно, если добавить ключевое слово static, то функция перестает быть non-static. Какая неожиданность /s

    Погуглите, что ли, что static в C++ означает.
    Ответ написан