Задать вопрос
  • C++ std::cout не выводит ничего?

    wataru
    @wataru Куратор тега C++
    Alex XYZ, Я имел ввиду, что отключаются целые части кода. Например, в вашем конкретном коде verbose может быть выключено через define.
    Написано
  • Доработка алгоритмической задачи JAVA. Требуется помощь >?

    wataru
    @wataru Куратор тега Алгоритмы
    Почти, только так у вас перебираются только варианты, где левый кусок коррче правого. Но ведь может же быть и наоборот. Можно повторить ваш алгоритм, но брать только те правые границы, где будет выполняться <=. Или просто перебрать все пары исчитать разность позиций * минимум из двух длин. Это будет точно такое же квадратичное решение.
    Написано
  • Что значит такое объявления полей в С++?

    wataru
    @wataru Куратор тега C++
    alex_ak1, Почитайте про ссылки в C++. Чаще в коде они встречаюстя как локальные переменные для сокращения кода, чтобы не писать длинные конструкции:
    int &item = container[index].something.property;
    item.x = 10;
    item.y = 12


    Еще иногда ссылки возваращают из методов, чтобы менять внутренние поля. Вот такого использования, как вы привели, я раньше тоже не видел. Но тут нет ничего сверхъестественного.

    Еще раз, ссылка - это как псевдоним для переменной. Это как указатель, но его не надо разыменовывать.

    Ссылки можно использовать и в классах. Там же можно использовать указатели? Вот ссылки там тоже можно использовать. Инициализация в объявлении используется повсеместно:
    class Foo() {
    public:
    ...
    private:
    int count_ = 10;
    int doulbe_count_ = count_*2;

    Это полностью эквивалентно:
    class Foo() {
    public:
      Foo() : count_(10), double_count(2*count_) {}
    }


    Ну вот у вас не int переменная, а ссылка. Использовать другие поля в инициализации можно. Надо только учитывать порядок инициализации и не использовать что-то еще не инициализированное.

    Видели же как константы объявляются через друг друга?
    const int kMaxBitrate = 100000;
    const int kMaxTime = 10;
    const int kMaxData = kMaxBitrate * kTime;


    Вот так же можно использовать в инициализации любых переменных любые другие.
    Написано
  • Что значит такое объявления полей в С++?

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

    Да, странно использовать поле класса в инициализации его же, но ничего не запрещает это делать.
    Написано
  • Доработка алгоритмической задачи JAVA. Требуется помощь >?

    wataru
    @wataru Куратор тега Алгоритмы
    Korifa, Потому что берется минимальный из двух заборов. min(1,2)=1. И получается участок (1,0),(2,0),(2,1),(1,1). Да, это квадрат, но квадрат - частный случай прямоугольника.
    Написано
  • Как максимально эффективно по скорости написать этот алгоритм преобразования строки?

    wataru
    @wataru Куратор тега Алгоритмы
    Хоть бы словами описали, что вам сделать-то надо вообще? Почему в конце возвращаться должно 4?
    Написано
  • Как записать шаблонные операторы для массива и контейнера?

    wataru
    @wataru Куратор тега C++
    Павел Соколов, Зачем, если можно тупо переприсвоить куда-то указатель?
    Написано
  • Как записать шаблонные операторы для массива и контейнера?

    wataru
    @wataru Куратор тега C++
    Павел Соколов, сообщение компилятора об ошибке часто содержит кучу подсказок, что сильно упрощает анализ.

    Кокретно тут попробуйте не использовать никаких ссылок для массива. И у вас будет только один оператор+. Передавайте его по значению. Это массив, т.е. указатель, передавать его по ссылке или через rvalue нет никакого смысла.
    Написано
  • Как набрать нужную сумму из определенного количества монет?

    wataru
    @wataru Куратор тега Алгоритмы
    Это не работает даже если вам надо набрать сумму один раз. А тут надо набрать ее максимальное количество раз.
    Написано
  • Как набрать нужную сумму из определенного количества монет?

    wataru
    @wataru Куратор тега Алгоритмы
    Нет, тут не сработает бинарный поиск. Это вообще какая-то адская смесь из задачи упавки и покрытия множества получается.
    Написано
  • Почему тут требуется cast double -> int?

    wataru
    @wataru Куратор тега C++
    Dyikot, Ах, это специфика Visual studio: https://learn.microsoft.com/en-us/cpp/error-messag...

    Именно в инициализации структур он это делать запрещает. gcc этим не страдает. У него это - warning.
    Написано
  • Доработка алгоритмической задачи JAVA. Требуется помощь >?

    wataru
    @wataru Куратор тега Алгоритмы
    Crypton88, Не в смысле указатели, как в памяти, а просто 2 индекса. int left; int right. цикл while (left < right)
    Написано
  • Как вывести кратчайший путь в графе?

    wataru
    @wataru Куратор тега Алгоритмы
    Вам надо еще в самом начале в searched помещать начальную вершину.

    А потом надо начать с конца и делать v = path[v], пока не придете в начало.
    Написано
  • Сколькими способами можно расставить на шахматной доске 8 ладей таким образом, чтобы они не били друг друга?

    wataru
    @wataru
    asault_ceko,
    А доказательство одного решения не является отрицанием другого возможного решения.
    в этой задаче один ответ - число. И если вы доказали, что оно равно чему-то, то любое "решение", дающее другой ответ - автоматически неправильное. Ну или у вас ошибка в доказательстве первого решения, но тут не этот случай.
    Написано
  • Сколькими способами можно расставить на шахматной доске 8 ладей таким образом, чтобы они не били друг друга?

    wataru
    @wataru
    asault_ceko, Ну вот уже на вашей картинке, где у вас 2 ладьи стоят - вы эту ситуацию можете получить двумя способами: когда на первом шаге взяли правую-верхнюю ладью, а на втором - левую-нижнюю; и когда наоборот. Это одна и та же расстановка ладьей, а подсчитана уже дважды.
    Написано
  • Более быстрый способ нахождения всех делителей числа?

    wataru
    @wataru Куратор тега Алгоритмы
    PythonDemon, делитель 2 обработать битовыми операциями. А дальше начинать с 3 и делать +=2. Не считать i*i каждый раз, а один раз подсчитать sqrt(n). Вместо if-else использовать вложенный while. Возможно это будет быстрее из-за более короткого и развернутого цикла.

    Но вообще, эти все оптимизации - это не про питон. Перепишите алгоритм на C++ какой-нибудь, там можно микрооптимизировать. А питон так далек от CPU, что вряд ли что-то тут поможет. Первый совет будет - переписать на язык с оптимизирующим компилятором.
    Написано
  • Где Decimal в C++?

    wataru
    @wataru Куратор тега C++
    Ланской Кирилл, Ну, FPU уже лет 25, как часть процессора. Когда-то давно это был со-процессор. Но сейчас работа с float ничем не отличается от работы с int с точки зрения процессора.

    Еще раз, если у вас числа маленькие (скажем, суммарно до 17 значащих цифр), то ваши Decimal ничем принципиально не отличаются от int64_t. И ничего в процессоре менять для них специально не надо. Не забывайте только при умножении/делении на 10^N делить/домножать, но это процессор уже умеет.

    Если же они у вас длинные (до 1000 знаков, например, как в питоне), то сделать схему, которая работает с такой длинной входных данных - практически невозможно. Она будет жрать слишком много транзисторов и будет не эффективна для маленьких чисел. Поэтому вся "длинная арифметика" - выполняется кучей инструкций над кусочками длинных чисел.

    Ну и почти в любом случае эти ваши Decimal можно заменить на float. Ибо часто не надо больше 18 значащих знаков. Поэтому за все время существования процессоров, никто так и не удосужился впендюрить в них специальные блоки для работы с такими числами.
    Написано
  • Где Decimal в C++?

    wataru
    @wataru Куратор тега C++
    Ланской Кирилл,
    Числа с плавающей запятой применяются чаще потому что:

    1) Они сильно быстрее чисел с фиксированной точкой. Потому что короткие числа с фиксированной запятой вы можете сами запросто реализовать в целых числах (например, считайте деньги в копейках, при выводе делите на 100). Или расстояние меряйте в целых миллиметрах, а не в float метрах. Время - в милисекундах. Тут вам никакой специальный тип не нужен.
    А длинные decimal, как в питоне - это очень медленно. В процессоре есть операции для работы с float/double. А с числами произвольной длины процессор работать напрямую не может. Это надо руками циклы реализовывать. То же деление - и то в столбик надо делать! А целые и float за одну операцию обрабатываются, в процессоре есть специальные цепи именно для этого.
    И использовать такой медленный тип и зависимый от реализации тип - это не философия языков с/с++. Кому надо, напишут/подключат свою библиотеку, которая заточена под их нужды.

    2) Числа с плавающей запятой имеют более обширное применение. Ведь редко когда вам достаточно фиксированной абсолютной точности. Как в суммах рублей, где точности до копейки хватит. Обычно вы не знаете заранее, сколько вам знаков понадобится. Очень маленькие числа нужны точнее, очень большие - не так важно. Вот и появляется идея плавающей запятой.
    Написано