Ответы пользователя по тегу C++
  • Есть ли словари (Как в Python) в C++?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Да.
    Вот тут можно ознакомится с типами контейнеров в C++: https://en.cppreference.com/w/cpp/container
    Там и примеры использования есть.
    Ответ написан
    Комментировать
  • Достаточно ли будет чтения cppreference для освоения STL?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Не слишком понятно, что имеется ввиду под "освоением STL". Это всего лишь библиотека языка. Вам надо знать, грубо говоря, что в ней есть в плане возможностей. А уж потом, по мере необходимости, идти и читать документацию.

    Проще говоря, допустим случай, когда вам надо отсортировать массив. Зная, что в STL есть и класс для массива и методы сортировки, вы идёте и читаете документацию, а потом используете. cppreference -- отличный ресурс с примерами.

    Я помню читал одну относительно тоненькую книгу по STL когда-то. Вроде бы неплохая была. Сейчас уже наверно устарела: "STL tutorial and reference guide" by David R. Musser .
    Ответ написан
    Комментировать
  • Почему вызов метода класса гораздо медленее вызова обычной функции и как это исправить?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Дело тут ещё и в методах измерения. По-хорошему, нужно взять любой тестовый фреймворк, будь-то google benchmark или там catch2, который позволяет осуществлять замеры производительности. В нём создать два бенчмарка и смотреть на разницу. Если она будет какая-то существенная, то брать профилировщик, правильно компилировать проект и смотреть что занимает больше всего времени выполнения.
    А уже после этого можно играть с флагами и смотреть какой код генерируется в обоих случаях. Можно и до в этом конкретном случае.

    И вот тогда вы сможете ответить на вопрос почему на вашем компьютере что-то работает медленнее или быстрее. А потому можно ещё и обнаружить, что для разных архитектур и/или компиляторов будет генерироваться разный код, будут применяться разные оптимизации и производительность может отличаться.

    PS
    Но у вас скорее всего и правда оптимизатор код выкидывает в первом случае всё считается во время компиляции, а функция встраивается. Во втором случае это сложнее.
    Вот тут ещё можете посмотреть какой код генерируется и с флагами поиграться: https://www.godbolt.org/
    Ответ написан
    Комментировать
  • Как оформить список C++?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Тут есть несколько фундаментальных ошибок.

    С++ -- это не C.
    Не стоить пользоваться массивами в стиле char nameF[10]. Для этого есть std::string. Для других типов можно использоватьstd::vector или std::array.
    То же самое и касательно printf/scanf. В C++ боле каноничным будет использование std::cout, std::cin.

    Не нужно записывать строковое представление в массив.
    Храните массив структур. При необходимости, распечатывайте в цикле.

    Пользуйтесь манипуляторами.
    В C++ можно подключить заголовочный файл iomanip. В нём есть манипулятор setw. Его использование поможет вам сделать таблицу с ровными краями. Есть ещё, например setprecision, если необходимо регулировать точность выводимых значений.

    PS
    Документацию по всему описанному выше можно найти на cppreference.com
    Ответ написан
    Комментировать
  • Как пофиксить ошибку линковщика?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Вам надо сделать следующее:
    - Создать проект в вашей IDE (VisualStudio), на основе CMake (предпочтительно) или MSBuild
    - Посмотреть как реализована интеграция с пакетным менеджером vcpkg
    - Добавить в список зависимостей vcpkg libcurl

    После этих простых шагов (по каждому из которых много документации в открытом доступе), всё у вас заработает. Точно так же можно получать другие полезные зависимости с помощью vcpkg.
    Это и будет современным и переносимым подходом к разработке и управлению зависимостями.
    Ответ написан
    Комментировать
  • Как перегрузить оператор так, чтобы принимать std::endl в своём потоке вывода?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Вот тут есть примеры сигнатуры функции: https://en.cppreference.com/w/cpp/io/basic_ostream...
    basic_ostream& operator<<(
        std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );
    Ответ написан
    Комментировать
  • Почему используется потенциально неинициализированная локальная переменная-указатель "matrix"?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    У вас же C++, поэтому можно и нужно сильно упростить код.
    #include <vector>
    
    // ...
    
    std::vector<std::vector<float>> matrix(n, std::vector<float>(m));
    Ответ написан
    Комментировать
  • Как выводить строчку, на которой было выброшено исключение?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Есть замечательная функциональность: https://en.cppreference.com/w/cpp/utility/source_l...
    Доступна начиная с C++20. Буду образовывать заодно и местных экспертов :)
    Ну или макросы.
    Ответ написан
    Комментировать
  • Какая разница в скорости между vector.resize и vector.reserve (C++)?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Разницы нет. Так как и в первом и во втором случае самая ресурсоемкая операция выполняется один раз. Во втором случае, проверку разумеется никакой оптимизатор не выбросит, но она 1) работает за константу и 2) практически не влияет за счёт branch prediction.
    Есть случаи, когда невозможно (неудобно) использовать resize, есть, когда reserve. Для 99% случаев подходы идентичны.
    Ответ написан
    Комментировать
  • Какие внешние зависимости и как распологать в проекте?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Рекомендую использовать vcpkg (можно и conan) или же docker-контейнер с нужными зависимостями для сборки. Сам генератор систем сборки CMake.

    Добавлять для этого подмодули или же использовать системный менеджер зависимостей можно конечно, но на дистанции это не самое удобное и переносимое решение. Так что я не рекомендую.

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

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Компилируйте всегда с флагами -Wall -Wextra -pedantic и будет вам счастье :)
    Ответ написан
    Комментировать
  • QT C++ Почему код так отличается?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Почему код на C++ , отличается от кода на qt?

    Вопрос изначально неверно сформулирован. Надо было написать "от кода, написанного с использованием Qt". На ваш взгляд есть визуальные отличия, но это потому что Qt предоставляет свои API.

    Чтобы вывести Hello world! в c++ нужно : cout << "Hello world!" << endl;
    А в Qt (будем считать, что это рописано в функции кнопки): qDebug() << "Hello world!";

    Вариант с cout будет точно так же работать.

    И вообще является ли qt отдельным языком программирования(Если да, то где лучше всего почитать про него)?

    Нет, Qt -- это не отдельный язык программирования, а набор библиотек или фреймворк (зависит от того, как использовать) + набор инструментов.
    Однако же, для разработки UI, с Qt можно использовать отдельный язык, который называется QML. Но можно и не использовать.
    Ответ написан
    Комментировать
  • Какую версию стандарта учить/использовать в 2021 году?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Начиная с 11, потому что в сравнении с прошлым стандартом это практически другой язык. Всё что выше, на данный момент, просто удобные фичи. Ну кроме сопрограмм и модулей -- это не просто фичи, но это отдельная тема. А всё что ниже 11 стандарта, уже очень старо и неудобно.
    Ответ написан
    5 комментариев
  • Как вернуть разные типы из std::function?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Как вернуть разные типы из std::function?

    variant, any, void*

    Но в вашем примере просто надо явно указать тип лямбды и/или приводить все возвращаемые значения к одному типу, раз уж предполагается что одно всё равно копируется в другое.

    Можно подумать о возвращении указателя на динамически созданные объекты ковариантных типов. Но я не уверен, насколько вам это подойдёт архитектурно.
    Ответ написан
    Комментировать
  • Как написать видео редактор?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Есть довольно обширный набор инструментов ffmpeg. Советую использовать его, а уж UI делать на чём угодно. В любом случае, желаю удачи, так как видео редактор -- штука сложная.
    Ответ написан
    Комментировать
  • Сколько врмени должно занимать получение частоты слов из большого файла?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Невозможно ответить однозначно. Время в данном контексте зависит от многих факторов: алгоритма, вашего железа, компилятора, флагов сборки и т.п. То есть, время не говорит читателю вашего вопроса вообще ничего.

    В конце концов, если ресурсы позволяют, можно прочитать весь файл в какой-нибудь структуру типа словаря и получать частоту вхождения слова за O(1) или O(log n) в зависимости от того, какую струтуру вы выбрали. Тут время будет тратится на чтения файла и создание структуры данных, но один раз.
    Ответ написан
    Комментировать
  • На что указывает указатель, на бит или байт?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    На что укажет line на бит или байт? А может даже килобайт?

    В вашем коде, line -- это даже не указатель. Вот name -- это как раз-таки адрес в памяти, по которому находится объект line типа string.

    На всякий случай, байт -- минимальный адресуемый набор данных. То есть, бит из байта адресовать вы не можете.

    Советую читать что-нибудь по архитектуре и истории компьютеров параллельно или до книг по C++. Что-то по операционным системам тоже не помешает.
    Ответ написан
    2 комментария
  • Что не так с инициализацией массива?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    C++, не С. Хватит страдать, ну не пишут так уже давным давно. Вот, пользуйтесь:
    std::vector<std::vector<double>>  dots = { {0, 0},  {1.5, 2.5},  {2.5, 1.5},  {4, 3}  };

    Это просто работает. Равно как использование std::vector вместо одномерных массивов, или std::array, если размер известен заранее.
    Ответ написан
    Комментировать
  • Как думаете, так можно?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Да. Оператор = возвращает результат операции. Но выражение лучше в скобки возьмите.
    Первый же фрагмент кода не должен компилироваться, так как компилятор не может вывести тип переменной add2.
    Ответ написан
    8 комментариев
  • Какими способами можно организовать взаимодействие между разными программами?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Есть очень много способов и библиотек. Выбирайте, то что подходит вам для решения задач: https://en.wikipedia.org/wiki/Inter-process_commun... (секция Approaches).
    Ответ написан
    Комментировать