Pull to refresh
4
0
Nikolai Panov @code_panik

User

Send message

По-моему, уже. По моему опыту и по другим многочисленным сообщениям происходящее очень похоже на работу над белыми списками. В нескольких федеральных округах ежедневно достаточно долго недоступны сайты cf, а когда доступны, тогда ютуб начинает работать. Можно считать, что новое дно достигнуто.

Впервые сталкиваюсь с тем, что РКН заблокировал примерно половину всех посещаемых сайтов! Даже на leetcode (Cloudflare) не попасть во время публикации комментария! Заблокированы, похоже все, сайты на Cloudflare, есть заблокированные на OVH. Провайдер РТ. К некоторым получалось подключиться со стоковым gdpi, поэтому можно считать, что виновник известен.

многие современные пользователи vi переназначают почти неиспользуемую клавишу Caps Lock для смены режимов редактора. Это ускоряет работу и делает её удобнее, особенно учитывая частое использование клавиши Escape.

Намного удобнее использовать альтернативу LCtrl+[ или для одинарного действия LСtrl+o.

Видимо, потому что класс TextureDX12 до виртуальности был оберткой над умным указателем. Хотя код не выглядит безопасным, потому что shared_ptr - не pod. И дизайн такой, что после случайного повторного вызова init память потечет. Если естественное начальное состояние nullptr, можно было в класс добавить инициализацию.

всегда есть более органичные способы монетизации

Что такое органичные? Например?

Код выглядит так из-за санитайзера. Компилятор с включенной опцией -fsanitize=undefined добавляет в исходный код нужные ему проверки. По теме есть лекция от разработчика asan https://www.lektorium.tv/lecture/23702

Казалось смешным, пока не вспомнил, что храню остатки урожая чеснока в масле в банке в холодильнике с температурой около 4 градусов. В тепле не оставлял, и чеснок полностью раздавлен. Использую только для жарки, и только сейчас дошло, что варианты с заправкой отпадают. А ведь это очень распространенный рецепт.

то сложность по выполнению у них одинаковая O(n)

У вас операции в map за логарифм, поэтому O(nlogn).

Хабр упорно не давал отправить личное сообщение, поэтому пишу сюда возможные неточности:

Например, мы хотим первой картой получить десятку треф, вероятность этого события в случайно собранной колоде будет 1/36, но шанс получить этой же карты на втором эксперименте будет уже 1/35.

  • Если нужно вытащить ровно на втором ходу, то вероятность события - это произведение вероятностей: <не вытащить на первом> * <вытащить на втором> = 35/36 * 1/35 = 1/36.

Шанс получить десятку треф на втором ходе будет (1/36 + 1/35).

  • Это предложение по смыслу повторяет предыдущее. Но если нужно вытащить за два хода, то вероятность равна: <вытащить на первом> + <вытащить ровно на втором (выше)> = 2/36. Это же проверяется другой формулой: <вытащить за два хода> = 1 - <не вытащить за два хода> = 1 - <не вытащить на первом> * <не вытащить на втором> = 1 - 35/36 * 34/35 = 1 - 34/36 = 2/36

У Shell sort опечатка в асимптотиках - квадрат относится только к логарифму. Ещё википедия говорит, что сортировка имеет O(nlogn) или O(nlog^2(n)) в лучшем случае (в зависимости от выбора шага) и до O(n^2) в худшем, https://en.wikipedia.org/wiki/Shellsort.

UPD тут даже интереснее.

Можно только предполагать, что произойдет, потому что race condition - ub. Ответил ниже https://habr.com/ru/articles/787776/comments/#comment_26417306.

Я имел в виду синхронизацию с join, но ошибка раньше - ответил ниже https://habr.com/ru/articles/787776/comments/#comment_26417306.

upd: Спасибо @LeetCode_Monkey и @qw1 за то, что отметили ошибку в моем комментарии. Не обратил внимание, что в третьем примере гонка, а значит ub, возникает уже при вставке первого элемента в main. То есть недостаточно делать reserve и использовать индексы. Из головы вылетело простое правило, что std::vector не является потокобезопасным, поэтому изменение vector в нескольких потоках без синхронизации - ub.

В третьем примере vector следует полностью строить в main, т.к. функция в конечном итоге ждет завершения всех потоков.

С memory_order здесь нет ребусов. По умолчанию этоmemory_order_seq_cst.

Пример кода https://godbolt.org/z/q7xj4x1zo,

#include <thread>
#include <vector>
using namespace std;

void func() {
    for (int i = 0; i < 100; ++i);
}

int main()
{   
    const int nworkers = 5; 
    vector<thread> threads;
    threads.reserve(nworkers + 1);    
    threads.emplace_back([&threads, nworkers]{
        for (int i = 0; i < nworkers; ++i)
            threads.emplace_back(func);        
    });
    for (int i = 0; i < nworkers + 1; ++i)
        threads[i].join();
    return 0;
}

Можно. threads[0] добавляется в main. Основной поток с main остановится на первом join(), пока не завершится threads[0], к завершению которого вектор будет построен.

В первом примере дважды допускается одна и та же ошибка - возврат ссылки на локальную переменную функции. Упрощенно https://godbolt.org/z/Ybcn3n1va. Сначала параметр v конструктора возвращаемого объекта ссылается на локальную переменную arg функции arg. Затем поле value ссылается на локальную переменную v конструктора named_arg.

В третьем примере можно было использовать vector::reserve(), чтобы гарантировать отсутствие реалокаций, и индексы вместо итераторов для корректного определения начала и конца вектора.

я не соблюдаю префиксы в именах переменных указывающих на их тип.

Такое легаси, https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rl-name-type

Information

Rating
Does not participate
Registered
Activity