Задать вопрос
  • Как переопределить операторы != и == в с++ для структуры?

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

    Но вообще-то раз вы итерируетесь по списку, вы сравниваете итраторы, а не структры. Поэтому достаточно просто использовать страндартную конструкцию:
    for (auto it = requests->begin(); it != requests->end(); ++it)


    И не надо ничего переопределять. Вы перепутали end и back. Первый возвращает итератор, а второй - элемент.
    Ответ написан
    2 комментария
  • Как найти сумму чисел на нечетных позициях после сортировки массива?

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

    Edit: Если стандартная сортировка не работает и L большое, то стоит посмотреть в сторону radix sort. Если бы L было относительно небольшим - то лучший вариант был бы сортировка подсчетом.
    Ответ написан
  • Как можно найти центроид четырёх точек ( Quadrilateral ), зная координаты этих вершин?

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

    Сначала надо триангулировать четырехугольник. Потом, центр масс каждого треугольника - среднее арифметическое координат. Далее, остается найти центр масс двух точек - центров масс треугольников, где в каждой точке лежит масса равная площади треугольника.

    Чтобы это работало и с невыпуклыми многоугольниками надо считать площадь треугольников через векторное произведение сторон, разрешая таким образом отрицательные площади у треугольников снаружи вашей фигуры.

    Итоговая фромула (в векторах):
    C = ((p1+p2+p3)/3*(p1p2*p1p3)+(p3+p4+p1)/3*(p1p3*p1p4))/((p1p2*p1p3)+(p1p3*p1p4))


    Тут pi - i-ая вершина четырехугольника, pipj - вектор между точками i и j. pipj*pkpl - векторное произведение двух векторов.
    Ответ написан
    Комментировать
  • Не получается найти пересечения multiset, в чем проблема?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Проблема в том, что итераторы unordered_set - имеют тип ForwardIterator. Варианты set_intersection, которые ждут вот такой вот итератор для результата, еще хотят и ExecutionPolicy.

    Но даже если вы поменяете тип у intersect, чтобы туда можно было вставлять ответ, ваш код не сработает, потому что set_intersection ждет упорядоченные интервалы. Вас unordered в названии контейнеров не смущает?
    Ответ написан
    Комментировать
  • Как считывать в массив целую строчку из файла?

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если бы вы использовали нормальные имена переменных, то вам бы сразу стало очевидно, какую одну строчку (даже один символ!) надо изменить, чтобы стали удалятся слова без буквы, вместо слов с буквами.

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Перебирайте a и b. Потом смотрите, какие значения может принимать c, чтобы ограничения выполнялись. Это будет отрезок чисел. Их не надо перебирать - можно их сразу все подсчитать. Например, если вы видите, что c<=10 удовлетворяет ограничения, то троек с текущими a, b - десять штук.
    Ответ написан
  • Как сделать компилятор СИ на джаве?

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

    Нужно понимать ассемблер, иметь знания по теории компиляторов (есть много книг), теории языков.

    Если же вам надо просто прикрутить компиляцию к вашему редактору, то, как многие другие IDE, вам надо будет лишь запускать сторонний компилятор (будь то gcc, clang, visual studio или что-то другое).

    У всех них есть консольное приложение которому можно передать файлы в качестве аргументов в коммандной строке. Вам остается лишь разобраться, как запускать приложения на Java.
    Ответ написан
    3 комментария
  • Как в vector на си вставлять элемент на конкретное место?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Сначала через memmove надо сдвинуть элементы с i по count-1 на позиции i+1...count. Потом чуть изменить memcopy, чтобы записать новв элемент на позицию i, а не count.
    Ответ написан
  • Как реализовать битовую матрицу оптимально по памяти?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Максимально компактно - хранить одномерную матрицу в битах целочисленного массива - по 8 бит на байт.

    Для матрицы NxM бит (i,j) будет лежать в (i*N+j)/8 ячейке массива. Номер бита - надо взять остаток от деления на 8.

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если вы повнимательнее посмотрите на свой код, то заметите, что там вывод массива a происходит в цикле while(n>k). Где именно ошибка - непонятно, ибо неясно, что ваш код должен делать. Или вы вывод массива вставили не туда, или GetComb делает что-то не то и цикл исполняется больше раз, чем должен.
    Ответ написан
  • Как определить класс, которому принадлежит вызываемый метод, из C++ кода?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Попробуйте __pretty_function__ в gcc и __FUNCSIG__ в visual studio.
    Ответ написан
    1 комментарий
  • Как сделать проверку числа на повторность в массиве?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Завести переменную флаг. Пройтись циклом по уже сформированному массиву, сравнить текущее число с числом в массиве. Если нашли совпадение, надо записать это в bool флаг. После цикла посмотреть на флаг.

    Можно из цикла при совпадении выходить через break.

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Для преобразования из строки в число можно восспользоваться atoi().

    Однако, если в строке фиксированное заранее известное количество чисел, то лучше воспользуйтесь sscanf(). Можно указать нужное вам количество %d через запятую примерно так:
    sscanf(s, "%d, %d", &a, &b);
    Ответ написан
  • Как соединить в пары элементы двумерного массива?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Надо обязательно массив массивов? Или подойдут кортежи? Так-то есть zip.

    А дальше можно через np.asarray и map преобразовать массив touples в массив массивов.
    Ответ написан
  • Какой список использовать?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    4 комментария
  • Как сменить разряды двухбайтового числа (С++)?

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Ну вот так прнято в С++. Оператор префиксного инкремента (++i) имеет такую сигнатуру - он возвращает ссылку на измененный объект. Если выхотите чтобы у вашего класса Date можно было сделать ++date, то надо переопределить вот такой вот оператор. Это позволяет писать более читаемый и короткий код. Вместо date.IncremeantAndReturn() можно использовать идиоматичное ++date, или даже что-то вроде while (++date < deadline). Это не обязательно делать, но иногда это весьма удобно и полезно.

    Оператор должен возвращать измененное значение, поэтому и возвращается *this после его увеличения;

    В этом коде Сopy не используется. Оно тут не нужно вообще. копия понадобится для постфиксного инкримента (i++), который должен возвращать неизмененный объект.

    Передача *this в конструктор Copy - это для вызова конструктора копирования, чтобы, внезапно, создать копию текущего объекта. Подумайте, как вам скопировать текущий объект? Надо новому объекту присвоить текущий, или в конструктор передать ему текущий объект. Но как передать текущий объект? У вас есть указатель на него this. Разыменовав этот указатель (*this) вы как раз можете передать текущий объект куда надо.
    Ответ написан
    Комментировать
  • Помощь с задачкой на Си?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Раз с русскими буквам не работает - это значит, что русские буквы идут в каком-нибудь utf-8 формате. Тогда один символ может задаваться несколькими байтами. Ваша работа с char проверяет, что слова являются полиндромами побайтово, что в случае utf-8 не то же самое, что посимвольно.

    Попробуйте или поменять кодировку файла на что-нибудь вроде CP1251.

    Или перепишите вашу программу используя wchar_t* и wcstok()
    Ответ написан
    3 комментария
  • Как найти все комбинации многоуровневого ассоциативного массива?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Рекурсивно. Функция должна получать уже набранный элемент и оставшиеся параметры. Она берет первый параметр и перебирает все его варианты, плюс пустой вариант (пропустить этот параметр). Добавляет это к элементу и рекурсивно запускается от оставшихся параметров с измененным элементом. Если параметров больеш нет - функция добавляет текущий ответ к результату. Правда этот алгоритм переберет еще и совсем пустой варинт []. Вам надо будет отдельно это проверить и не добавлять этот элемент в результат.
    Ответ написан
    1 комментарий