Ответы пользователя по тегу C++
  • Как оптимально считать матрицу с консоли c++?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Если вы хотите оптимизировать программу по времени выполнения, то необходимо задать нужный размер матрицы с самого начала, так как он у вас известен. Например так:
    std::size_t r = 0, c = 0;
    std::cin >> r >> c;
    std::vector<std::vector<int>> matrix(r, std::vector<int>(c));

    Далее, у вас же просто числа, которые можно читать сразу в переменную:
    for (std::size_t i = 0; i < c; ++i)
    	for (std::size_t j = 0; j < r; ++ j)
    		cin >> matrix[j][i];


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

    PS
    Первая ошибка в вашем коде заключается в том, что вектор g пустой в момент обращения по индексу. Замените [] на метод at() и получите исключение.
    Ответ написан
    Комментировать
  • Есть ли в С++ метод toString у классов?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Нет. Потому что в C++ действует правило "не плати за то чем не пользуешься" и нет рефлексии на уровне языка.

    Если вы хотите выводить класс в поток, то реализуйте: ostream& operator<< (ostream& os, const Foo &o), где Foo -- это ваш класс. Ну а если вам класс необходимо приводить к строковому представлению, то да, придётся вам реализовать метод руками, или же, что архитектурно более правильно, сделать отдельный класс и/или функцию для преобразования.
    Ответ написан
    3 комментария
  • Как составить условие для программы?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Из условия я вижу, что в коробке может быть только один предмет из списка. Следовательно, вам нужно выбрать 4 псевдо-случных элемента из последовательности. Сделать это можно многими способами. Например, можно просто случайно перемешать массив из всех доступных подарков и предложить пользователю выбрать индекс (номер коробки) от 0 до 3. Ну и вывести название подарка под указанным номером. Что-то вроде такого:
    std::vector<std::string> presents {"паук", "носок", "iPhone 11 Pro", "книга по С++", "футбольный мяч", "флешка", "билет в кино", "наручные часы", "кефир"};
    
    std::random_device rd;
    std::mt19937 g(rd());
     
    std::shuffle(presents.begin(), presents.end(), g);
    
    std::size_t boxNumber = 0;
    std::cin >> boxNumber;
    
    std::cout << presents[boxNumber] << std::endl;

    Тут, понятное дело, надо добавить интерфейсную часть и обработку ошибок ввода...
    Ответ написан
    Комментировать
  • Что же такое hex?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    В том, что endl добавляет перевод строки и делает flush буфера cout, а hex -- это манипулятор, для того чтобы переводить всё числа, которые идут после него в шестнадцатиричную систему исчисления.
    Ответ написан
    Комментировать
  • Есть ли в для C++14 map с поддержкой constexpr хэша?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Из коробки такого нет, насколько мне известно. Так можно сделать, но все входные данные должны быть известны на этапе компиляции. Довольно редкий случай на практике.
    Ответ написан
  • Как собрать библиотеку .lib [muParser]?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Так там же CMakeLists.txt в корне есть. Что-то вроде "mkdir build && cd build && cmake .. && make" (виндовый аналог этого) не работает?
    Ответ написан
    Комментировать
  • Почему возникает undefined reference?

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

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Почему все так рьяно говорят о том, что C++ ужасен и не нужен, но при этом он стабильно входит в топ 10 яп?

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

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

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

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Просто добавьте int foo(); выше bar, а реализацию оставьте как есть.
    Слово static тут не нужно, можете удалить.
    Ответ написан
    Комментировать
  • Как передать json buffer как аргумент функции в ArduinoJson 6?

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

    Ваш вариант с переменной не подходит, потому что её значение на этапе компиляции не известно.

    Можно ещё попробовать DynamicJsonDocument его размер можно указать в рантайме, согласно документации.
    Ответ написан
    Комментировать
  • Какой стандарт c++ изучать?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    C++17 -- нормальный стандарт для изучения.

    Дело всё в том, что все стандарты после 11го подход к разработке кардинально не меняют, а просто добавляют немного фич. Не обязательно осваивать все возможности языка -- их в плюсах много.
    Ответ написан
    Комментировать
  • Oшибка iostream vs code, как исправить?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Рекомендую использовать IDE если вы только изучаете C++. Там вы, с большой вероятностью, таких проблем не получите. Всё-таки блокноты с плагинами -- это немного другое.
    Ответ написан
    1 комментарий
  • Как передать двумерный массив в функцию без динамического выделения памяти?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Да есть. В C++ есть стандартная библиотека, в которой есть некоторые структуры данных:
    #include <vector>
    
    template <class T>
    using Matrix = std::vector<std::vector<T>>;
    
    // ... 
    
    template <class T>
    void print(const Matrix<T> &matrix)
    {
        for (auto &&r : matrix) {
            for (auto &&e : r) {
                std::cout << e << " ";
            }
            std::cout << std::endl;
        }
    } 
    
    // ...
    
    Matrix<int> m = {
        {1, 2, 3},
        {5, 6, 7, 8},
        {9, 10}
    }
    
    print(m);


    Вот тут можно прочитать о классе vector: https://en.cppreference.com/w/cpp/container/vector

    PS
    Я это всё не компилировал, но как-то так в общем должно работать.
    Ответ написан
  • Небольшая задача из книги Страуструпа. Как её решить?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Условие правильное, просто наверное перевод немного странный.
    Программа и выведет возраст в месяцах. Однако, если пользователь введёт не целое число лет, например 5,5, а вы сохраните результат в целочисленную переменную, то вы потеряете полгода, или 6 месяцев. Программа наглядно это демонстрирует. Просто попробуйте использовать для хранения введённых данных сначала int, а потом double и посмотрите на результат, после ввода 5,5 в обоих случаях. Упражнение нацелено как раз на это.
    Ответ написан
    Комментировать
  • Как правильно пользоваться разделителем кода для Windows и linux?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Да, это нормальный подход. Но такой код необходимо хорошо изолировать за кросс-платформенными интерфейсами. Так будет легче поддерживать проект, ну или использовать кросс-платформенные библиотеки в дальнейшем.
    Ответ написан
    Комментировать
  • Как протестировать с помощью gtest функцию main(argc, argv[])?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    По факту получается, что вы пишите системный тест. Следовательно, для него вам необходимо уже скомпилированное приложение.
    Самый простой вариант, в этом случае -- это просто вызывать приложение с помощью std::system и проверять вывод. Так как std::system возвращает просто код завершения, вывод можно писать в какой-нибудь файл. Ну а потом, как и в обычном тесте, сравнивать то что получилось и то, что должно получиться. По факту у вас есть два приложения: сам тест и та утилита, которую вы тестируете.
    Ответ написан
    Комментировать
  • Статическая компиляция QT?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Так можно сделать, для этого вам нужна статическая сборка Qt. Только в профайл вашего проекта ещё надо будет добавить static в переменную config.
    Ответ написан
  • В чем суть %d, %o, %s и %c?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    А в чём конкретно проблема? Вот тут https://en.cppreference.com/w/c/io/fprintf есть подробное описание и примеры использования.

    Использовать, чтобы было быстрее и проще выводить различные строки. Допустим, надо вам вывести в лог какое-то сообщение, в котором будут фигурировать значения переменных, вы можете сделать так:
    int v1 = 1;
    float v2 = 2.4;
    printf("My message %i with some data %f", v1, v2);

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

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Вы или тег "C++" уберите, или C++ используйте, а не C.
    using Map = std::vector<std::vector<char>>;
    Map map = {
       {1, 1, 1},
       {0, 1, 0},
       {0, 1, 0},
    };
    
    // ...
    void scaleMap(Map &map, int coefficient)
    {
       // ...
       Map newMap(newSize, std::vector<char>(newSize));
       // ...
       map.swap(newMap);
    }

    Всё просто, быстро и безопасно. Главное за границы массива не выходите.
    Ответ написан
    Комментировать