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

    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;
    }
    Ответ написан
  • Как перевести строку бинарного файла в UTF8?

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

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

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

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    map<int,int> f(x) {
    ...
    }
    
    map<int, int> mp = f(x);
    Ответ написан
    1 комментарий
  • Как реализовать правосторонний бинарный поиск?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Уберите проверку на совпадение внутри while. Присваивайте границам интервала mid, а не mid+1 или -1.
    Ответ написан
    Комментировать
  • Как связать динамическую библиотеку с кодом cpp?

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

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

    Заводите очередь, положите в нее корень дерева. Потом в цикле, пока очередь не пуста, берете из нее элемент, выводите, и кладете в очередь его детей. Если надо разделить по уровням глубины, то надо вместе с указателем на элемент класть в очередь его глубину. Например, кладите в очередь std::pair. Или заведите 2 очереди и работайте с ними параллельно.

    На C++ можно или использовать std::queue, или просто std::vector. Во втором случае добавление в очередь будет просто push_back, а для удаления из очереди заведите счетчик, который указывает на голову. При изъятии элемента просто сдвигайте этот счетчик.
    Ответ написан
    Комментировать
  • В каком виде изобразить такую программу?

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

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

    Надо порисовать на бумажке и убедится, что из строки S вы можете получить только строки вида S(k1)S(k2)S(k3)...S(kn), Где S(x) - x-ый префикс строки S, т.е. первые x символов.
    При этом k1 >= k2, ... k1>= kn.

    При чем все строки такого вида можно получить.

    Доказывается по индукции по количеству операций. Изначально строка именно такого вида (k1=длина строки). После каждой операции, эта строка сколько-то раз копируется и как-то обрезается по длине. Поэтому любая полученная строка будет такого вида. И каждую такую строку можно построить: применяйте операции с k равными k1, k1+k2, k1+k2+k3... Так вы за n операций соберете все префиксы по одному.

    Теперь, раз вам во входном файле задана подстрока результата, вам надо проверить, что эта строка состоит из подстроки S, за которой идут префиксы строки S.

    Так, пример из условия bcabc состоит из подстроки bc и одного префикса abc.

    В задаче не очень большие ограничения, поэтому можно в тупую для каждой подстроки i..j результирующей строки определить, является ли она суффиксом первой строки. Также для каждой подстроки первой строки можно определить, является ли она префиксом второй строки.

    Потом нужно построить граф: из позиции 0 сделайте ребра во все позиции, где заканчивается какая-то подстрока первой строки в начале второй. Из позиции i>0 сделайте ребра во все позиции j такие, что подстрока i...j префикс первой строки.

    Потом, если в этом графе есть путь из вершины 0 в вершину с номером длины второй строки - YES. Иначе - NO.

    Это решение за квадрат, если подстроки искать не совсем в тупую: для проверки на суффикс внешний цикл ведите по правому концу, а внутренний - по левому концу убывая. Так можно сдвигать второй указатель, пока строка остается суффиксом, проверяя каждый раз только один символ. Похожим образом можно проверять все подстроки на совпадение с префиксом.
    Ответ написан
    Комментировать