Библиотека С# С++
https://t.me/+WgGTjeH0p1NjMDFi - ссылка на канал По всем вопросам- @workakkk @ai_machinelearning_big_data - Machine learning @itchannels_telegram - 🔥лучшие ит-каналы @csharp_ci- C# академия @pythonlbooks- python книги📚 РКН: clck.ru/3Fmvsw
Больше📈 Аналитический обзор Telegram-канала Библиотека С# С++
Канал Библиотека С# С++ (@cpluscsharp) является активным участником. Сейчас сообщество объединяет 10 066 подписчиков, занимая 11 687 место в категории Технологии и приложения и 62 890 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 10 066 подписчиков.
Согласно последним данным от 14 сентября, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -2, а за последние 24 часа — 1, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 9.77%. В первые 24 часа после публикации контент обычно набирает 3.78% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 984 просмотров. В течение первых суток публикация набирает 381 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 6.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как c++, rust, github, .net, asp.net.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“https://t.me/+WgGTjeH0p1NjMDFi - ссылка на канал
По всем вопросам- @workakkk
@ai_machinelearning_big_data - Machine learning
@itchannels_telegram - 🔥лучшие ит-каналы
@csharp_ci- C# академия
@pythonlbooks- python книги📚
РКН: clck.ru/3Fmvsw”
Благодаря высокой частоте обновлений (последние данные получены 15 сентября, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
std::map<std::string, ...> не обязан создавать временный std::string при каждом поиске
Если ключ уже приходит как std::string_view, можно использовать transparent comparator:
std::map<std::string, int, std::less<>> status_codes{
{"not_found", 404},
{"timeout", 504}
};
std::string_view key = "timeout";
auto match = status_codes.find(key);std::weak_ptr может удерживать память даже при expired() == true.
Причина в std::make_shared: обычно он размещает объект и управляющий блок в одной аллокации.
В примере на скриншоте массив на 16 МиБ находится прямо внутри Blob. После удаления последнего shared_ptr:
* деструктор объекта вызывается;
* expired() возвращает true;
* общий блок памяти остаётся выделенным, пока существует хотя бы один weak_ptr.
После сброса последней слабой ссылки блок можно освободить.
Что делать: удалять протухшие ссылки из долгоживущих кешей. Для крупных объектов также можно рассмотреть отдельную аллокацию через std::shared_ptr<Blob>(new Blob()).
Нюанс касается размера самого объекта. Если данные хранятся в обычном std::vector, его отдельный буфер освобождается при вызове деструктора.
[Разбор от Microsoft](https://devblogs.microsoft.com/oldnewthing/20230815-00/?p=108602)std::list
- но случайного доступа через [] нет
- порядок вставки не гарантируется
-
Особенно полезно для игровых движков, пулов соединений, систем частиц и других случаев, где объекты постоянно создаются и удаляются, а другие части программы хранят указатели на них.
Коротко: std::hive - не более быстрый vector, а скорее гораздо более cache-friendly альтернатива list.
https://sandordargo.com/blog/2026/09/02/cpp26-hive3 + 4 * 2
в постфиксную:
3 4 2 * +
После этого калькулятору уже не нужно каждый раз разбираться с приоритетами операторов и строить полноценное AST.
Как работает идея:
- один стек хранит операторы;
- второй поток формирует результат;
- операторы с более высоким приоритетом выходят раньше;
- скобки и ассоциативность обрабатываются по правилам стека.
В итоге выражение можно вычислять последовательно и без рекурсивного спуска.
Простой, старый и до сих пор очень красивый алгоритм для парсеров, калькуляторов и компиляторов.
#Algorithms #C #Programming #Compilers #ComputerScience
float kahanSum(const float *nums, int count)
{
float sum = 0.0f;
float correction = 0.0f;
for (int i = 0; i < count; ++i)
{
float adjusted = nums[i] - correction;
float next = sum + adjusted;
correction = (next - sum) - adjusted;
sum = next;
}
return sum;
}
Здесь correction запоминает ошибку округления, которая потерялась при предыдущем сложении.
Обычная сумма быстрее, но Kahan Summation полезен там, где важна численная точность:
- научные расчёты;
- статистика и аналитика;
- графика и симуляции;
- обработка больших массивов;
- накопление очень маленьких значений рядом с большими.
Метод предложил Уильям Кэхэн в 1965 году. Небольшое усложнение цикла может заметно уменьшить ошибку без перехода на более тяжёлый числовой тип.enum class: безопасно, но местами раздражает
enum class даёт строгую типизацию и не позволяет случайно смешивать значения с обычными числами.
Но есть нюанс: даже если enum используется как набор флагов,
Flags::Read | Flags::Write
не скомпилируется.
Для |, &, ^, ~ придётся вручную определить операторы и приводить значения к базовому типу.
Это правильное поведение с точки зрения type safety, но бойлерплейта становится заметно больше.
Поэтому в некоторых C++-проектах для битовых флагов до сих пор используют обычный enum внутри namespace: меньше защиты, зато код значительно проще.fopen
• открыть файл назначения
• выделить буфер через malloc
• читать кусками через fread
• записывать через fwrite
• освободить память и закрыть файлы
Всё честно и прямо: байты читаются из одного места и записываются в другое.
Именно поэтому C до сих пор так важен. Он не всегда самый удобный, но он показывает, что реально происходит под капотом.
После такого начинаешь лучше понимать не только язык, а саму систему.
i & -i
Она находит младший установленный бит числа.
Почему это работает?
В two’s complement число -i получается как инверсия битов i плюс 1.
Когда мы делаем i & -i, остаётся только самый правый бит, равный 1.
Например:
i = 12 // 1100
-i // 0100 в нужной маске
i & -i = 4
Именно это значение говорит Fenwick Tree, на сколько нужно прыгнуть по индексам.
Для обновления:
for (; i < MAXN; i += i & -i)
tree[i] += v;
Мы идём вверх по структуре и обновляем все узлы, которые покрывают этот индекс.
Для запроса суммы:
for (; i > 0; i -= i & -i)
s += tree[i];
Мы идём вниз и собираем нужные блоки суммы.
Одна и та же операция управляет двумя направлениями:
* i += i & -i — перейти к следующему ответственному узлу
* i -= i & -i — убрать последний блок из prefix sum
Поэтому Fenwick Tree такой компактный:
никаких явных рёбер, указателей и рекурсии. Только массив и битовая арифметика.
Красота структуры в том, что дерево как бы спрятано внутри двоичного представления индекса.uint32_t, если всё хорошо, или std::error_code, если буфер слишком короткий. Вызывающая сторона сразу видит: здесь результат может быть ошибкой, её нельзя «случайно забыть» так же легко, как при старом стиле с кодами возврата.
Это особенно удобно для системного кода, сетевых протоколов, парсеров, embedded и всего, где исключения либо запрещены, либо нежелательны.
std::expected не делает обработку ошибок магической. Он просто заставляет контракт функции быть честным: успешный результат и возможная ошибка описаны прямо в типе.2^30 элементов и больше.
Проблема возникает при вычислении середины:
mid = (low + high) / 2;
На очень больших массивах low + high может вызвать переполнение.
Правильнее писать так:
mid = low + (high - low) / 2;
В C такое переполнение может привести к выходу за границы массива и непредсказуемому поведению. В Java это обычно заканчивается ArrayIndexOutOfBoundsException.
Та же ошибка затрагивала mergesort и огромное количество других алгоритмов «разделяй и властвуй».