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

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

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

    Вместо SegmentTree tree = new SegmentTree(a, n);
    надо
    SegmentTree tree(a, n); или SegmentTree *tree = new SegmentTree(a, n);

    new - создает указатель. Инициализировать им нужно, соответственно, указатель.
    Ответ написан
  • В чем причина возникновения ошибки std::bad_alloc при поиске в графе?

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

    Вы там еще очередь pop-аете раньше времени.
    Ответ написан
  • Что означает traits_type::eof()?

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

    type_traits::eof() - возвращает код конца файла, для текущего параметра шаблона.

    Вся эта шаблонная магия взялась для того, чтобы можно было читать из файла или char, или wchar, или еще черт знает что, в зависимости от кодировки. Раз читаемые символы могут быть какими угодно, то и код конца файла нужен свой собственный для разных типов символов. Поэтому eof() является частью type_traits в streambuf.
    Ответ написан
    Комментировать
  • В чем проблема обхода в ширину и глубину?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В BFS вы не проверяете, что вершина помечена, и всегда кладете вершину в очередь. А еще там в конце какой-то левый цикл ненужный. Поиск бесконечно циклится и съедает всю память. DFS, похоже, правильный (есть много претензий к стилю, правда).
    Ответ написан
  • Как правильно использовать конструктор структуры?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы передаете структуре в конструктор ее саму! Ее еще не создано, а вы ее передаете куда-то. Зачем вам вообще в структуре хранить ссылку на другую структуру? Это вы из питона, что ли взяли? В C++ не надо методам класса/структуры передавать указатель на нее, они средствами языка привязаны уже к экземпляру. Можно обращаться просто к членам структуры напрямую из методов. Или через this->, если есть конфликт имен.
    Ответ написан
    4 комментария
  • Как вывести часть bitset-a?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    С битсетом можно работать, как с массивом. У него есть operator[]. Просто пройдитесь циклом в 3 итерации и выводите x[i].
    Ответ написан
    Комментировать
  • Как реализовать "копирование" файла на C++?

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

    Используйте, например, ifstream и ofstream. Только нужно работать в бинарном режиме. Открывайте файлы, передавая std::ios::binary в конструкторы. Используйте read для чтения и write для записи. Там даже примеры есть вам релевантные в документации.

    Еще можно всякие итераторы использовать и std::copy.
    Ответ написан
  • Как мне сделать чтоб вибирались числа из промежутка между найменшим и найбольшем в двумерном масиве?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    if (max >= arr[i][j]) {
            max; 
          }
          else if (max <= arr[i][j]) {
            swap(max, arr[i][j]);
            maxii = i; maxjj = j;
          }


    ЧТО ТУТ ВООБЩЕ ПРОИСХОДИТ?
    Понятно, что пытались найти индекс максимума в массиве, но тут такой бред написан...

    Попробуйте сначала найти максимум тупо в одномерном массиве, а потом обобщить код на двумерный. Они только лишним циклом и отличаются же.

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

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

    Бинарным поиском находите в первом массиве индекс значения и выдаете ответ из второго массива по тому же индексу.

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

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

    Клиент после отсылки данных должен из сокета читать ответ.
    Ответ написан
    Комментировать
  • Код не успевает выполниться.С++.Что делать?

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

    Можно поиск символов перевода строки ускорить всякими SIMD инструкциями.

    Но вообще, у вас файл маленький, не должно быть проблем со скоростью.
    Ответ написан
    Комментировать
  • Есть ли в C++ функция преобразующая текст в байты и байты в текст по заданной кодировке?

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

    С помощью его можно читать файлы в utf_8, например, так:
    std::ifstream f("file.txt");
    std::wbuffer_convert<std::codecvt_utf8<wchar_t>> conv(f.rdbuf());
    std::wistream wf(&conv);


    Потом читаете из wistream, как будто это обычный cin. Только вместо char нужен wchar_t, а вместо string - wstring.
    Ответ написан
    3 комментария
  • Почему неправильно считывается строка?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    file.get() читает один символ, возвращает его и переходит к следующему символу ввода. Поэтому код:
    while (file.get() != ']')
    {
       temp += file.get();
    }


    читает первый символ, сравнивает со скобкой, потом приписывает в temp второй символ. Потом читает третий и, возможно, приписывает четвертый и т.д. Два вызова file.get() выполняют два чтения.

    Правильно делать так:

    while ( (с = file.get()) != ']')
    {
       temp += с;
    }


    И похожим образом обрабатывайте '[' перед этим. Читайте в переменную, сравнивайте и не забудьте прочтенный символ засунуть в строку.

    Ну, или используйте в условиях istream::peek.
    Ответ написан
    Комментировать
  • Как вынуть публичный ключ из сертификата, для дальнейшей подписи и шифрования данных через библиотеку CryptoAPI?

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

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

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

    Если уж и параллелить radix sort, то надо параллельно считать сколько в каждом куске каждой цифры, потом высчитать, куда каждая цифра из каждого куска должна попасть, и потом параллельно каждый кусок перетасовать в нужные места.
    Ответ написан
    Комментировать
  • Можно ли определить тип переменной в удобном виде?

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

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    2 внешних цикла распаралелены omp. Там в коде инструкции взять и запустить несколько потоков, которые пройдутся по всем значениям x и y.

    Это работает, потому что каждая итерация вычисляется независимо от остальных.
    Ответ написан
    Комментировать
  • C++ WinForm Как правильно вывести массив структур переданный через указатель?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    auto ch_kol() {
        baseProgr base[max];
        return &base;


    Вы тут возвращаете адрес локальной переменной. Так делать нельзя. При выходе из функции локальная переменная перестает существовать и у вас указатель на фигню остается.

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В template<> в хедере надо оборачивать весь класс, а не каждую функцию по отдельности.

    Посмотрите примеры.
    Ответ написан
    Комментировать