• Лучше ли использовать enum для цвета нежели struct?

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

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

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    У вас там во входных данных 2 точки с одинаковым x (23) и разным y (18, 11). В результате получается деление на 0.

    Нельзя инетрполировать такие данные полиномом. Ибо это функция от x - для каждого x одно значение y.

    Ошибка не в программе, а в некорректных входных данных.

    Можно интерполировать параметрически, если хотите. Заведите параметр t и ищите две функции x(t), y(t) - скармливайте этой программе 2 набора данных 1,x1;2,x2;3,x3...n;xn и 1,y1;2,y2;...n,yn.

    Тогда у вас будет кривая заданная двумя полиномами, проходящая через заданные точки в заданном порядке.
    Ответ написан
  • Почему на leetcode различается скорость одного и того же кода?

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

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

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Надо или использовать std::vector, или самосталятельно выделять под массив память. Тогда массив будет просто int*, выделяете его как new int[n]. Не забудьте в этом случае сделать delete[] в деструкторе.
    Ответ написан
  • Проверка на достижимость в направленном графе?

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

    В нем уже нельзя ввести поняие LCA вообще. Например, граф 0->2, 0->3, 1->2, 1->3. Тут для вершин 2 и 3 есть два общих предка: 0 и 1. И какой из них самый нижний?
    Ответ написан
  • Как называется такая алгоритмическая задача?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Задача о покрытии, наверное
    Ответ написан
    Комментировать
  • Почему printf() выводит нули после точки?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    потому что int cusBal[10]. У вас массив целых чисел, вы его инициализируете константой 35.50. При этом происходит приведение к типу int и часть после точки с запятой теряется.

    Вторая проблема, вы эту int переменную выводите через "%.2f". Так что вам еще очень повезло, что оно вывело вообще что-то похожее на нужное число.

    Об обеих ошибках компилятор вам выдавал предупреждение (если он правильно настроен). Их все надо внимательно прочитать и убедиться, что они все безобидные, а лучше, чтобы их вообще не было.
    Ответ написан
    Комментировать
  • Как называется это свойство набора кодов (словаря)?

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

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

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

    template<typename T>
    struct return_type;
    template<typename R, typename... Args>
    struct return_type<R(*)(Args...)>
    {
    	using type = R;
    };
    
    typedef bool (*function)(int);
    
    template<typename T>
    class smart_pointer {
    public:    
        smart_pointer(T func) : func_(func) {}
        
        template<typename R = typename return_type<T>::type, typename ...Args>
        R operator()(Args... args) const {
            return func_(args...);
        }
        
        T func_;
    };
    
    bool foo(int t) {
        return t % 2 == 0;
    }
    
    
    int main() {
        smart_pointer<function> sm(&foo);
        std::cout << sm(5);
    
        return 0;
    }
    Ответ написан
    Комментировать
  • Почему программа не выдаёт ошибку, если поместить выражение в скобки?

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

    Без скобочек сначала выполняется <<. Фактически, у вас написано вот это: (std::cout<<a) == b;
    << - переопределенный оператор для std::cout, он выведет a на экран и вернет ссылку на std::cout, которую потом программа попытается сравнить с b и не сможет, потому что операция такого сравнения не определена.

    Если же поставить скобки, то сначала выполнится ==, результат ее работы - bool - уже потом будет через оператор << выведен в на экран.
    Ответ написан
    Комментировать
  • Как устроено окто дерево? Как происходит отсечение видимых грайней?

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


    Да, именно так, надо обойти все узлы дальне.
    Но при этом уже не надо проверять на видимость и код там попроще.

    А профит тут в том, что вы вот так вот обходите не все дерево. а только маленькую его часть.

    Окто дерево используется, чтобы отсечь те объекты, которые сзади или сбоку от камеры и точно не видны. Оно не помогает отсекать объекты, закрытые стеной. Тут, действительно, используется z-buffer.
    Ответ написан
    4 комментария
  • Зачем использовать кучу если есть стек? а так же где применяются указатели и ссылки?

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

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

    Т.е. если вам нужны данные доступные вне какой-то функции, да еще их точный размер и/или количество неизвестно на этапе компиляции - вам нужно что-то кроме стека и глобальных переменных. Это и есть куча.
    Ответ написан
    4 комментария
  • Не могу понять, почему у выходного файла идет смещение и ухудшение качества картинки?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Потому что у вас неправильно применяется векторизация к задаче. У вас там свертка с ядром 5x5. Т.е. для одного выходного пикселя вы должны сделать 25 умножений и их сложить. Вы же делаете 25*8 уможений для каждого пикселя. Потом как-то странно их еще и суммируете.

    Если у вас уж есть векторизация, то вы какие операции распаралеливаете? Вот эти 25 умножений же, правда? Значит у вас в программе не должно быть вообще вот этих циклов от -2 до 2. Вы эти операции сначала развернули в 25 отдельных, а потом их по 5 или 8 штук объединили в одну векторную операцию.
    Ответ написан
    5 комментариев
  • Какой компилятор выбрать для C++?

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

    И вообще gcc - он в экосистеме линукс. Чтобы оно работало под виндой, то надо ставить специальную прослойку эмуляции экосистемы линукса, вроде mingv.

    Под виндой легче использовать компилятор от microsoft: msvc. Легче всего его поставить в комлекте с бесплатной версией visual studio.
    Ответ написан
    2 комментария
  • Код должен выводить только те буквы, которые встречались во всех словах, но вместо этого программа резко завершает работу. Что не так?

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Единственный способ научиться решать задачи - решать задачи. Много и разных. Если задачи по програмированию, то прорешивайте какой-нибудь leetcode. Если минут за 5 вообще идей нет - смотрите подсказки. Еще через 10 - смотрите чужие решения. Важно только потом все равно эти решения самостоятельно написать потом сразу.
    Ответ написан
    Комментировать
  • Как подключить файл во время работы программы?

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

    C C++ все гораздо хуже, но какая-нибудь LUA имеет гораздо более развитый набор утилит именно для этого.
    Ответ написан
    Комментировать