Ответы пользователя по тегу C++
  • В чем проблема обхода в ширину и глубину?

    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<> в хедере надо оборачивать весь класс, а не каждую функцию по отдельности.

    Посмотрите примеры.
    Ответ написан
    Комментировать
  • Как работает эта часть кода?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    % 10 - дает остаток от деления на 10. Что то же самое, то последняя цифра числа. /= 10 - делит нацело на 10, или отбрасывает последнюю цифру.

    Вот так этот цикл и пробегается по всем цифрам числа a.
    Ответ написан
    Комментировать
  • Почему не работает dynamic_cast?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Определение функции шаблона должно быть inline в .h файле (вставьте код из code.cpp в code.h).

    Ну, или в code.cpp файле добавьте куда-то строку
    findViewById<WEngine::TextView*>;

    Это все потому, что в C++ архаичная система хедеров. Когда компилится main.cpp, он не видит определения метода, только декларацию из code.h. Когда компилится code.cpp, он не знает, что main понадобится инстанциирование шаблона с каким-то типом. Поэтому не создает его. А потом линкер уже ругается, что не может найти функцию.
    Ответ написан
    Комментировать
  • E1696 не удается открыть источник файл "stack.h"?

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    По-моему, так гораздо понятнее:
    template <class Container>
    void print(const Container& c, string sep=" ", string end="\n")
    {
      for (const auto& e : c)
         std::cout << e << sep;
      std::cout << end;
    }


    Если же очень хочется через ostream_iterator, то:
    template <class Container>
    void print(const Container& c, string sep=" ", string end="\n")
    {
    
      std::ostream_iterator<typename Container::value_type> 
          out_it(std::cout, sep.c_str());
      std::copy(c.begin(), c.end(), out_it);
      std::cout << end;
    }
    Ответ написан