Задать вопрос
  • Почему один код выполняется быстрее другого C++?

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

    Первый вариант отбрасывает дробные части от копеек, а второй отбрасывает дробные части от рублей. Ведь при делении на 100 в целых числах идет округление вниз. Если брать p процентов с округлением вниз от числа в рублях, то и получится целое число в рублях. Если брать от числа в копейках, то и получится целое число в копейках.

    Поскольку второй код отбрасывает все копейки при прибавлении, то ему требуется больше итераций, чтобы дойти до y. На самом деле он может даже виснуть, если там получается прибавление 0.
    Ответ написан
    1 комментарий
  • Как с MathNet.Numerics уменьшить число коэффициентов у преобразования Фурье?

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

    В компьютерах используется дискретное преобразование, потому что ну не могут компьютеры работать с бесконечным неприрывным объектом, коим является функция.

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    А что вы вводите? Сдается мне, что ваш код ждет в цикле
    while (getchar() != '\n') continue;

    Это произойдет, если вы введете строку короче len-1 символов.

    Чтобы это исправить, можно вставить в функцию проверку, если ch после первого цикла оказался '\n' - то второй цикл не нужен.

    Или можно этот цикл вставить перед break в предыдущий цикл. Вы же должны пропустить символы до перевода строки только если строка слишком длинная.
    Ответ написан
    Комментировать
  • Как ускорить работу скрипта?

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

    Ну или можно использовать std::unordered_map<std::string, int> вместо trie.
    Ответ написан
  • Почему возникает проблема "terminate called after throwing an instance of 'char const*'"?

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

    Обрабатывайте исключения (конструкция try..catch) где-нибудь в main, тогда можно будет вывести сообщение с ним связанное. Может станет понятнее, откуда оно было брошено. Или можно просто пискать в коде "throw" - скорее всего оно и срабатывает.
    Ответ написан
    Комментировать
  • Какова сложность алгоритма?

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

    Решение со стеком будет линейным.
    Ответ написан
    Комментировать
  • Почему возникает ошибка?

    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++
    Разработчик на С++, экс-олимпиадник.
    Не совсем поятно, что вы хотите сделать.

    Если вы хотите передавать массив, то поменяйте функцию f так, чтобы она его принимала.

    void f(const std::vector<int> &arg){
    }
    f({1,2,3});


    И да, массив не в квадратных скобках задается, а в фигурных.
    Передача по ссылке, чтобы не копировать эти все значения лишний раз. Для трех элементов погоды почти не делает, но если их 100, или тем более 1000 - это заметная оптимизация. const, чтобы можно было передавать временные объекты. Плюс так понятно, что это аргументы входные и вы их менять в функции не будете.
    Ответ написан
  • Что находится в .text секции?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    В .text Находится исполняемый код.

    6kb там не зря. Там куча вспомогательного кода, чтобы взаимодействовать с операционной системой. Начиная от загрузки всяких внутренностей libc, до настройки консоли.
    Ответ написан
    Комментировать
  • Как получить ввод c++ для задачи по спортивному программированию?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Число q, судя по тексту, уже дано вам в файле.
    Поэтому просто циклом q раз читайте команду.
    Там читайте одно число, и если это 1, то читайте i, x. Если это 2 - то читайте k.

    for (int line = 0; line < q; ++line) {
      cin >> command;
      if (command == 1) {
        int i, x;
        cin >> i >> x;
        UpdateValue(i, x);
      } else {
        int k;
        cin >> k;
        ShiftRight(k);
      }
    }
    Ответ написан
    3 комментария
  • Можете покритиковать мой код?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    1) (Вкусовщина) стиль наименования не самый удачный. И переменные и функции называются одинаково - каждое слово с большой буквы без разделителей. Во всех массово применяемых стилях обычно переменные, функции и константы называются по разному. Например, переменные можно называть log_password. Функции и так оставить с большой буквы, а константы - полностью большими буквами.

    2) обилие вложенных if. Практикуйте ранний выход. Например в Login() можно сделать так:
    if (Data.is_open()) {
      std::cout << "Ошибка. У вас нет аккаунта" << std::endl;
      return;
    }


    И весь оставшийся код оказывается на 1 уровень выше.

    3) Бесконечные рекурсивные вызовы - это плохо. Рано или поздно программа упадет с закончившимся стеком.
    У вас Menu вызывает Login, который опять вызывает Menu. Да и сам Menu тоже.

    Лучше сделать в Menu бесконечный цикл (while(true)) и или выходить из программы через exit(), или возвращать из Login, что надо завершаться и тогда в Menu делать break.
    Ответ написан
    1 комментарий
  • Для чего в C++ сделано описание методов вне класса?

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

    Используется для этих вещей:
    1) Можно иметь "циклические зависимости". Например, функция использует класс, а класс использует функцию. Или два класса используют друг друга. В каком порядке их определять в файле? Так уж повелось, что компилятору надо как-то знать о всех используемых в коде штуках до их использования (в основном). Возможность отдельно объявить функцию/класс как раз решает эту проблему. Можно было бы переделать весь компилятор, чтобы он сначала по всему файлу искал функции, но по каким-то, возможно веским, причинам это не было сделано еще в Си. А C++ потащил и это с собой.

    2) Разделение программы на "модули" или библиотеки. Этот ужасный, устаревший и неудобный механизм include-ов позволяет разбить программу на хедеры и файлы с реализацией. Потом хедеры только с объявлениями включаются в другие файлы, чтобы компилятор знал о коде в других модулях, а реализация собирается в отдельный объектный файл. В конце линкер собирает все объектные файлы в исполняемый файл и/или библиотеки. Если бы объявления и определения не были разделены, то весь код в проекте компилировался бы кучу раз в каждом объектном модуле. Это просто глупо.

    3) И вообще - это красиво. Иметь где-то аккуратный список всех методов класса (или функций в библиотеке) удобно, когда вам надо разобраться, а что этот класс делает и как его использовать. Если бы там еще и код методов был, то это было бы сложнее читать.
    Ответ написан
    Комментировать
  • STD::set erase не работает?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас в set хранятся указатели на char. В set они сравниваются как указатели. Как значения адресов. Strcmp же смотрит на содержимое памяти, на которую указатели ссылаются. Поэтому имея в памяти две совпадающие строки вы получите вот это вот - указатели не равны, а strcmp - равно.
    Ответ написан
    Комментировать
  • Как исправить ошибку сегментации C++ (segmentation fault)?

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

    Одна очевидная ошибка - вы не уменьшаете n при удалении элемента. И тогда на следующей итерации вы будете что-то делать с элементом за концом массива.

    Еще одна ошибка у вас в том, что вы в add, например, всегда удаляете указатель на f. А в самом начале этот указатель неинициализирован. Удаление такого случайного указателя - это undefined behavior. Программа может упасть сразу, а может только на следующей итерации цикла.

    Советую инициализировать f в nullptr и перед удалением всегда проверять, что удаяемый казатель не нулевой.
    Ответ написан
    2 комментария
  • Как получить все точки в промежутке координат XY1;XY2?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Проще "отсортировать" заданные координаты. Если x1 > x2, поменяйте их местами. То же с z1 и z2, А потом остается только первый случай в вашем коде.

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

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Константа вылезает из деталей реализации операций. Вот сортировка пузырьком делает ровно n(n-1)/2 сравнения и помен в худшем случае. Еще столько же операций инкремента счетчика индекса, столько же проверок на конец цикла. Плюс еще n операций для внешнего цикла. И все это O(n^2). Хотя там есть есть /2 и операций четыре типа. И они еще разное время занимают. Скажем, проверки занимают 10 тактов, а инкрименты - 1. Но вся эта мишура не влияет на скорость роста и прячется в константе. Если все сложить. То будет C*n^2 +C2*n+C3 тактов на алгоритм.
    Ответ написан
    Комментировать
  • Как в данной системе из линейных уравнений получился x и y?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Это если решить систему любым методом, то вы получите вот такое вот решение. Неважно, как решать - решение же однозначное и выражается через коэффициенты (может чуть в другой форме, но после упращения и приведения к общему знаменателю вы все-равно именно эту формулу и получите).

    Можно из одного уравнения выразить y через x, подставить в другое, найти x, потом найти y.

    Или можно получить эти формулы в одно действие методом Крамера.
    Ответ написан
    5 комментариев
  • Почему вызов метода класса гораздо медленее вызова обычной функции и как это исправить?

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

    Правильнее добавить в тестируемую функцию какую-то работу. Тогда вы будуте действительно сравнивать вызов функции и метода. Или отключить всю оптимизацию.
    Ответ написан
    2 комментария