Все сервисы Хабра

Сообщество IT-специалистов

Ответы на любые вопросы об IT

Профессиональное развитие в IT

Удаленная работа для IT-специалистов

Войти на сайт
  • Все вопросы
  • Все теги
  • Пользователи

Хабр Q&A — вопросы и ответы для IT-специалистов

Получайте ответы на вопросы по любой теме из области IT от специалистов в этой теме.

Узнать больше
другие проекты хабра
  • Хабр
  • Карьера
  • Фриланс
Задать вопрос
Anton3

Антон Жилин

  • 163
    вклад
  • 1
    вопрос
  • 143
    ответа
  • 57%
    решений
Ответы
  • Информация
  • Ответы
  • Вопросы
  • Комментарии
  • Подписки
  • Нравится
  • Достижения
  • Как нециклически вывести массив в консоль?

    Anton3
    Антон Жилин @Anton3
    C++20
    auto view = vec
      | std::ranges::views::transform(
          [](auto x) { return fmt::format("{}\n", x); })
      | std::ranges::views::join;
    std::ranges::copy(view, std::ostream_iterator<int>(std::cout));

    Замечу, что работать это будет сильно медленнее, чем если просто вывести каждое число в цикле.
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Что такое буфер ввода/вывода?

    Anton3
    Антон Жилин @Anton3
    Для ввода-вывода в консоль или файл программа делает системные вызовы чтения или записи. Не вдаваясь в подробности, скажу, что они дорогие. Если ты читаешь по одному символу из std::cin, то это будет работать жутко медленно.

    Что происходит на практике: происходит один системный вызов, cin читает в свой внутренний буфер сразу, скажем, 4096 байт, и потом отдаёт тебе из буфера по одному символу, которые ты у него запрашиваешь. Нетрудно заметить, что работать это будет (в моём примере) где-то в 4096 раз быстрее.

    Зачем очищать. Пока ты не сделал flush, то, что ты вывел в поток, находится в буфере. cout ждёт, пока ты докинешь ему ещё байтиков, чтобы вывести всё потом большим куском. Если же ты хочешь, чтобы вывод произошёл прямо сейчас, то нужен flush.
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Как в набранном текстве между слов вставить ещё слово?

    Anton3
    Антон Жилин @Anton3
    Приведённый код... неидеален. Закрою на код глаза и подскажу идею.

    Символ возврата каретки \r перемещает вывод на начало последней строки, при этом дальнейший вывод идёт поверх неё, что нам и нужно. Так что: считываем строку, меняем её, как душе угодно, выводим \r, выводим модифицированную строку.
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Первая попытка в ООП. Прошу оценить код. Что можно было бы исправить?

    Anton3
    Антон Жилин @Anton3
    Во-первых, программу стоит переписать без использования сырых указателей. Вместо них — std::string и std::unique_ptr<Person>. Создать указатель на наследника можно так:
    static_cast<std::unique_ptr<Person>>(std::make_unique<Formalist>())


    Во-вторых, присоединяюсь к maaGames, Type выкинуть, а для получения информации, специфичной для наследника, использовать виртуальные функции.
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Можно ли в C++ передать в шаблонный параметр класса типа unsigned long размер инит-листа aka std::initializer_list::size() через конструктор?

    Anton3
    Антон Жилин @Anton3
    template <size_t N>
    class ArrayWrapper {
      MyType data_[N];
    
    public:
      explicit ArrayWrapper(MyType (&&arr)[N]) : data_(std::move(arr)) {}
    };
    
    template <size_t N>
    ArrayWrapper(MyType (&&arr)[N]) -> ArrayWrapper<N>;
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Как перебрать массива char через for по буквам?

    Anton3
    Антон Жилин @Anton3
    1. Не используй массивы вида тип arr[размер]; (сырые массивы). Иначе — боль и страдания. Массив = vector<int> (Ну или там double, или что там. Туториал по vector легко загуглишь.)

    2. Для хранения строк в C++ используется string (нужен #include <string>)

    3. sizeof вообще про другое, и новичку он понадобиться не может. Вместо него: string.size()

    4. Собственно, ответ на вопрос "перебрать символы строки":
    for (const char c : str) {
      ...
    }

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

    Anton3
    Антон Жилин @Anton3
    std::vector<int> row = ...;
    std::unordered_map<int, size_t> counts;
    for (int x : row) ++counts[x];
    size_t n_duplicates = row.size();
    for (auto p : counts) {
      if (p.second == 1) --n_duplicates;
    }
    Ответ написан более двух лет назад
    8 комментариев
    8 комментариев
  • Как создать список из разных объектов классов?

    Anton3
    Антон Жилин @Anton3
    Во-первых, список (list) из Python — это не std::list, а std::vector в C++.

    Во-вторых, чтобы избавиться от проблем с удалением объектов, вместо обычных указателей используй std::unique_ptr из #include <memory>.

    Выглядеть управление объектами будет как-то так:
    std::vector<std::unique_ptr<Figure>> figures;
    std::vector<std::unique_ptr<Decoration>> decorations;
    
    figures.push_back(std::make_unique<Ball>(аргументы для конструктора Ball));
    figures[0]->какой-нибудь метод Figure


    В-третьих, чтобы наследование не вызывало неопределённого поведения, тебе (в обычной жизни, если ты не гуру разработчик компилятора) обязательно нужно объявить виртуальный деструктор в базовом классе: virtual ~Figure() = default; + для Decoration.

    В-четвёртых, по сути вопроса, чтобы иметь возможность сделать что-то полезное с Figure/Decoration, нужно добавить в них виртуальные функции (методы) C++ и вызывать примерно так, как я написал выше. Эту тему предлагаю освоить самому.
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Как грамотно посчитать значение комплексного выражения в C++?

    Anton3
    Антон Жилин @Anton3
    В качестве workaround предлагаю объявить локальную переменную
    const auto i = std::complex<double>(0, 1);
    И домножать на неё в выражении
    Ответ написан более двух лет назад
    2 комментария
    2 комментария
  • Ошибка "C++ requires a type specifier for all declarations" Что делать?

    Anton3
    Антон Жилин @Anton3
    На 7 строке: main() заменить на int main()
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Что находится в вызове наследуемого конструктора?

    Anton3
    Антон Жилин @Anton3
    MyWindow — это твой контроллер, который ты написал собственными руками. В нём тебе предлагается использовать кодогенерированную вьюху UI::MyWindow (другой класс!), которую написала за тебя Qt по указаниям из файла `.ui` от QtDesigner. Как именно использовать? UI::MyWindow хранится в MyWindow в поле ui.
    Ответ написан более двух лет назад
    3 комментария
    3 комментария
  • Каким образом можно изменять тип числового литерального значение?

    Anton3
    Антон Жилин @Anton3
    Правильно ли я понимаю, что ты хочешь сделать что-то вроде:
    std::string s = "hi!";
    s = 42;

    На C++ написать такое напрямую нельзя. Тут стоит задаться по меньшей мере 2 вопросами. Во-первых, возможно, в твоей ситуации достаточно преобразовать из одного типа в другой, например:
    s = std::to_string(42);

    Во-вторых, если нужен такой динамизм, может, стоит присмотреться к Python?)

    Наконец, ок, если захотеть, то можно запихнуть в одну переменную всё, что угодно. Правда, с болью:
    std::any x = 42;
    x = "wut";
    x = std::pair{1, 'A'};
    std::cout << std::any_cast<std::pair<int, char>>(x).first;
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Как в с++ с помощью директивы #define сделать замену символа?

    Anton3
    Антон Жилин @Anton3
    Если ты хочешь реализовать калькулятор наподобие
    double res = x OPERATOR y;
    И как-то подставлять на место OPERATOR нужную операцию во время выполнения программы, то нет, в C++ это невозможно. Пиши 4 ветки if-else для своего калькулятора.
    Ответ написан более двух лет назад
    3 комментария
    3 комментария
  • Как сломать кэш первого уровня на примере кода и правильно ли я мыслю на тему выравнивания, кэша и слова цпу?

    Anton3
    Антон Жилин @Anton3
    Во-первых, вывод в cout перевешивает любые промахи кеша, так что его надо заменить, например, на подсчёт суммы.

    Во-вторых, зачем тут именно вектор указателей? Тем более, сырых указателей и new/delete?! (Кстати, delete-то и нету...) Заменить просто на вектор из Car.

    В-третьих, лучше всего промахи кеша продемонстрирует не последовательный, а рандомный доступ к памяти. То есть в цикле на протяжении миллиона (или сколько там нужно) итераций тягай элемент из рандомного места в массиве и добавляй в сумму. Кстати, подумай над тем, чтобы использовать рандом пошустрее, а то он убьёт всю затею так же, как cout.

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

    Anton3
    Антон Жилин @Anton3
    Найди позицию самой правой точки в имени файла. Преобразуй всё, что после неё и до конца имени, в число. (Если не преобразовалось, считаем номер равным нулю.) Создаём вектор пар "имя до точки" - номер. (Для файлов без номера берём имя файла целиком, а не только до точки.) Сортируем вектор пар с кастомным компаратором, который сравнивает сначала имя, потом номер. Можно мне не писать код? :)
    Ответ написан более двух лет назад
    3 комментария
    3 комментария
  • Зачем нужен setlocale(LC_ALL, "") в c++?

    Anton3
    Антон Жилин @Anton3
    Обычно подобными выкрутасами пытаются (тщетно) заставить древнюю консоль Windows выводить русский текст. Если разрабатывать под MacOS или Linux, то это пригодится, например, для ввода-вывода double через точку, а не через запятую, как может быть по умолчанию для русской локали.
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Как пробежаться подстрокой по строке до конца?

    Anton3
    Антон Жилин @Anton3
    Проблемы в коде:
    • Потенциальный выход за границу (res2001)
    • strncpy_s — опять кто-то пишет на Visual C++. Функцию заменить, см. ниже
    • Сейчас длина буфера пересчитывается каждый раз в цикле — без комментариев
    • Если это не строка, а буфер, то он не должен заканчиваться на \0, и для него не должны работать строковые операции. Для подстроки нужно выделить ровно 8 байт. Размер большого буфера нужно взять откуда-то отдельно, не через strlen. Для копирования использовать std::copy
    • Пусть подстрока будет тоже unsigned char. char должен использоваться для текста, а не для байтов
    Ответ написан более двух лет назад
    2 комментария
    2 комментария
  • Когда ввожу 1.0 при выходе выводиться 1, что делать?

    Anton3
    Антон Жилин @Anton3
    cout << fixed << setprecision(15) << ...
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Как передать в лямбду контекст класса?

    Anton3
    Антон Жилин @Anton3
    Чтобы подобное не повторилось в будущем, нужно удалить конструкторы копирования/перемещения и операторы копирования/перемещения у Protocol. Этот класс действительно должен быть non-movable, т.к. его адрес сохраняется в лямбде, которую тяжело контролировать.
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Как решить проблему с undefined reference c++?

    Anton3
    Антон Жилин @Anton3
    Нужно добавить флаг компилятора -lpthread
    Ответ написан более двух лет назад
    1 комментарий
    1 комментарий
Оценили как «Нравится»
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • Следующие →
Самые активные сегодня
  • Dr. Bacon
    • 11 ответов
    • 0 вопросов
  • Vindicar
    Vindicar
    • 6 ответов
    • 0 вопросов
  • Evgenii
    • 6 ответов
    • 0 вопросов
  • rPman
    • 5 ответов
    • 0 вопросов
  • sergiks
    Сергей Соколов
    • 5 ответов
    • 0 вопросов
  • Drno
    • 4 ответа
    • 1 вопрос
  • © Habr
  • О сервисе
  • Правила
  • Обратная связь
  • Блог

Войдите на сайт

Чтобы задать вопрос и получить на него квалифицированный ответ.
Войти через центр авторизации