fa
Feedback
C++ geek

C++ geek

رفتن به کانال در Telegram

Учим C/C++ на примерах

نمایش بیشتر
3 611
مشترکین
اطلاعاتی وجود ندارد24 ساعت
-17 روز
-3630 روز
آرشیو پست ها
🚀 Подборка Telegram каналов для программистов Системное администрирование, DevOps 📌 https://t.me/bash_srv Bash Советы https://t.me/win_sysadmin Системный Администратор Windows https://t.me/sysadmin_girl Девочка Сисадмин https://t.me/srv_admin_linux Админские угодья https://t.me/linux_srv Типичный Сисадмин https://t.me/devopslib Библиотека девопса | DevOps, SRE, Sysadmin https://t.me/linux_odmin Linux: Системный администратор https://t.me/devops_star DevOps Star (Звезда Девопса) https://t.me/i_linux Системный администратор https://t.me/linuxchmod Linux https://t.me/sys_adminos Системный Администратор https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало) https://t.me/sysadminof Книги для админов, полезные материалы https://t.me/i_odmin Все для системного администратора https://t.me/i_odmin_book Библиотека Системного Администратора https://t.me/i_odmin_chat Чат системных администраторов https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др. https://t.me/sysadminoff Новости Линукс Linux 1C разработка 📌 https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С https://t.me/DevLab1C 1С:Предприятие 8 https://t.me/razrab_1C 1C Разработчик https://t.me/buh1C_prog 1C Программист | Бухгалтерия и Учёт https://t.me/rabota1C_rus Вакансии для программистов 1С Программирование C++📌 https://t.me/cpp_lib Библиотека C/C++ разработчика https://t.me/cpp_knigi Книги для программистов C/C++ https://t.me/cpp_geek Учим C/C++ на примерах Программирование Python 📌 https://t.me/pythonofff Python академия. https://t.me/BookPython Библиотека Python разработчика https://t.me/python_real Python подборки на русском и английском https://t.me/python_360 Книги по Python Java разработка 📌 https://t.me/BookJava Библиотека Java разработчика https://t.me/java_360 Книги по Java Rus https://t.me/java_geek Учим Java на примерах GitHub Сообщество 📌 https://t.me/Githublib Интересное из GitHub Базы данных (Data Base) 📌 https://t.me/database_info Все про базы данных Мобильная разработка: iOS, Android 📌 https://t.me/developer_mobila Мобильная разработка https://t.me/kotlin_lib Подборки полезного материала по Kotlin https://t.me/androidspb Разработка под Android: Kotlin, Java. Фронтенд разработка 📌 https://t.me/frontend_1 Подборки для frontend разработчиков https://t.me/frontend_sovet Frontend советы, примеры и практика! https://t.me/React_lib Подборки по React js и все что с ним связано Разработка игр 📌 https://t.me/game_devv Все о разработке игр Библиотеки 📌 https://t.me/book_for_dev Книги для программистов Rus https://t.me/programmist_of Книги по программированию https://t.me/proglb Библиотека программиста https://t.me/bfbook Книги для программистов БигДата, машинное обучение 📌 https://t.me/bigdata_1 Big Data, Machine Learning Программирование 📌 https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций https://t.me/rust_lib Полезный контент по программированию на Rust https://t.me/golang_lib Библиотека Go (Golang) разработчика https://t.me/itmozg Программисты, дизайнеры, новости из мира IT https://t.me/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 https://t.me/nodejs_lib Подборки по Node js и все что с ним связано https://t.me/ruby_lib Библиотека Ruby программиста https://t.me/lifeproger Жизнь программиста. Авторский канал. QA, тестирование 📌 https://t.me/testlab_qa Библиотека тестировщика Шутки программистов 📌 https://t.me/itumor Шутки программистов Защита, взлом, безопасность 📌 https://t.me/thehaking Канал о кибербезопасности https://t.me/xakep_2 Хакер Free Книги, статьи для дизайнеров 📌 https://t.me/ux_web Статьи, книги для дизайнеров Математика 📌 https://t.me/Pomatematike Канал по математике https://t.me/phis_mat Обучающие видео, книги по Физике и Математике https://t.me/matgeoru Математика | Геометрия | Логика Excel лайфхак📌 https://t.me/Excel_lifehack https://t.me/mir_teh Мир технологий (Technology World) Вакансии 📌 https://t.me/sysadmin_rabota Системный Администратор https://t.me/progjob Вакансии в IT

std::initializer_list Присваивайте значения контейнерам непосредственно с помощью списка инициализаторов, как это можно делат
std::initializer_list Присваивайте значения контейнерам непосредственно с помощью списка инициализаторов, как это можно делать с C-массивами. Это справедливо и для вложенных контейнеров. Скажите спасибо С++11. ➡️ @cpp_geek

Городские сервисы Яндекса отправились в Tech Tour — встречайте в Казани и Нижнем Новгороде  15 и 22 ноября приглашаем на митапы о технологиях в Городских сервисах Яндекса — эксперты выступят с докладами, проведут кейслаб и вайбкодинг для backend-, ML- и DS-разработчиков.  📍В Казани расскажут о том, как в Маркете создали AI-ассистента внутри маркетплейса, разработали поиск лекарств в Еде и научились оптимизировать алгоритмы назначения и распределения исполнителей в Лавке.  📍А в Нижнем Новгороде поделятся, как создают сервис Турбо со скидками для пользователей и поддерживают консистентность данных в продукте.  Кроме докладов и практических активностей в каждом городе будут интерактивы, карьерные смолл-токи и нетворкинг.  📌 Казань, 15 ноября 📌 Нижний Новгород, 22 ноября Сохраняйте даты и регистрируйтесь Мероприятие бесплатное. Количество мест ограничено — пожалуйста, дождитесь нашего подтверждения.

std::hash Это структура шаблонного класса, определенная в заголовочном файле. Она предоставляет хеш-функцию для хэширования р
std::hash Это структура шаблонного класса, определенная в заголовочном файле. Она предоставляет хеш-функцию для хэширования различных типов данных, включая встроенные и пользовательские. std::hash используется, например, в ассоциативных контейнерах, таких как std::unordered_map и std::unordered_set, для быстрого доступа к элементам по ключу. Для пользовательского типа данных требуется явная специализация структуры std::hash для корректной работы хэширования. ➡️ @cpp_geek

Что случится, если exception выйдет за пределы потока? Если exception выходит за пределы потока, то оно не может быть обработ
Что случится, если exception выйдет за пределы потока? Если exception выходит за пределы потока, то оно не может быть обработано на текущем уровне, т. к. он уже завершен. В таком случае исключение будет зарегистрировано как неперехваченное и может привести к аварийному завершению программы. Чтобы избежать данной ситуации, необходимо обернуть код, где может возникнуть исключение, в try-catch блок на том же уровне, что и поток, с которым он связан. ➡️ @cpp_geek

Dependency Injection Dependency Injection (DI) — это паттерн проектирования, который позволяет управлять зависимостями между
Dependency Injection Dependency Injection (DI) — это паттерн проектирования, который позволяет управлять зависимостями между объектами. Он помогает разделить создание объектов от их использования и обеспечить более гибкую и тестируемую архитектуру программы. В DI объекты получают свои зависимости не напрямую, а через внешний источник, который их предоставляет. Этот источник называется контейнером внедрения зависимостей. Контейнер отвечает за создание и управление зависимостями, а объекты получают их через конструкторы, методы или свойства. ➡️ @cpp_geek

Готовы с нуля создавать телекоммуникационные решения для беспроводных мобильных сетей и сопутствующих услуг? 🧑‍💻 Отправляйт
+5
Готовы с нуля создавать телекоммуникационные решения для беспроводных мобильных сетей и сопутствующих услуг? 🧑‍💻 Отправляйте резюме до 19 октября и присоединяйтесь к команде YADRO Телеком! Как получить оффер за 3 дня? Листайте карточки выше — все подробности там! 💙 Оставляйте заявку — мы ждём именно вас!

Задача Найти среднее арифметическое в трех рядах. Для начала продумаем наше решение. Сразу условимся, что длина ряда у нас бу
Задача Найти среднее арифметическое в трех рядах. Для начала продумаем наше решение. Сразу условимся, что длина ряда у нас будет 5. Нам надо найти среднее арифметическое в трех рядах, и в каждом по отдельности, т.е. мы сначала сделаем цикл для рядов, а потом в этом цикле сделаем еще один цикл, только уже для чисел этого ряда. Теперь подумаем, какие переменные нам понадобятся: Переменная summa — для суммы чисел каждого ряда; Переменная average — для среднего арифметического каждого ряда; Переменная number — обычное число которое мы будем постоянно прибавлять; Переменные i и j — для циклов, перпенные у нас будут локальные, т.е. использоваться и объявляться в цикле. ➡️ @cpp_geek

Execution policy для параллельных алгоритмов Execution policy в C++ — это новшество, введенное в стандарте языка C++17. Это м
Execution policy для параллельных алгоритмов Execution policy в C++ — это новшество, введенное в стандарте языка C++17. Это механизм, который позволяет выбрать, как именно должны выполняться алгоритмы в стандартной библиотеке: последовательно или параллельно. Существуют три варианта execution policy: - seq: выполняет алгоритм последовательно. - par: выполняет алгоритм параллельно, используя все доступные ядра процессора. - par_unseq: выполняет алгоритм параллельно и может использовать неупорядоченное исполнение. Execution policy может быть использован в комбинации с многими алгоритмами в стандартной библиотеке, такими как std::for_each, std::transform, std::reduce и другими. Например, код выше выполняет алгоритм std::for_each параллельно. ➡️ @cpp_geek

В чем разница между git fetch и git pull? Разница между этими командами заключается в том, что когда вы используете команду g
В чем разница между git fetch и git pull? Разница между этими командами заключается в том, что когда вы используете команду git fetch, Git извлекает последние изменения из удаленного репозитория в ваш локальный репозиторий, но оставляет эти изменения в отдельной ветке git origin. А команда git pull извлекает и интегрирует (скачивает и сливает) последние изменения из удаленного репозитория в вашу текущую ветку работы. ➡️ @cpp_geek

std::tie std::tie — это функция, которая создает кортеж ссылок на lvalue из своих аргументов или экземпляров std::ignore. Она
std::tie std::tie — это функция, которая создает кортеж ссылок на lvalue из своих аргументов или экземпляров std::ignore. Она может использоваться для распаковки кортежей или пары значений в отдельные переменные. Например, если у вас есть функция, которая возвращает std::pair или std::tuple, вы можете использовать std::tie, чтобы присвоить значения этого кортежа отдельным переменным. В этом примере мы используем std::tie для распаковки результата вызова set_of_s.insert(value) в две переменные: итератор iter и логическую переменную inserted. Это позволяет нам проверить, было ли значение успешно вставлено в набор. ➡️ @cpp_geek

Давай программировать стек TCP/IP. Part 3: TCP Basics & Handshake Теперь, когда наш стек TCP/IP в пользовательском пространст
Давай программировать стек TCP/IP. Part 3: TCP Basics & Handshake Теперь, когда наш стек TCP/IP в пользовательском пространстве имеет минимальные реализации для Ethernet и IPv4, пришло время рассмотреть работу протокола управления передачей (Transmission Control Protocol, TCP). Работающий на четвертом сетевом уровне OSI1, транспортном, TCP отвечает за восстановление ошибочных соединений и ошибок в доставке пакетов. По сути, TCP - это рабочая лошадка Интернета, обеспечивающая надежную связь практически во всех современных компьютерных сетях. TCP не совсем новый протокол - первая спецификация вышла в 1974 году2. С тех пор многое изменилось, и TCP обзавелся множеством расширений и исправлений3. В этой статье мы рассмотрим основные теоретические основы TCP и попытаемся дать мотивацию для его разработки. Кроме того, мы рассмотрим заголовок TCP и обсудим установление соединения (TCP handshaking). В качестве последнего шага мы продемонстрируем первую функциональность TCP в нашем сетевом стеке. https://www.saminiir.com/lets-code-tcp-ip-stack-3-tcp-handshake/ ➡️ @cpp_geek

Давай программировать стек TCP/IP. Part 2: IPv4 & ICMPv4 На этот раз в нашем TCP/IP стеке в пространстве пользователя мы реализуем минимально жизнеспособный IP-уровень и протестируем его с помощью ICMP-запросов эхо (известных также как ping). Мы рассмотрим форматы IPv4 и ICMPv4 и опишем, как проверять их целостность. Некоторые функции, такие как фрагментация IP, оставлены в качестве упражнения для читателя. Для нашего сетевого стека был выбран IPv4 вместо IPv6, так как он до сих пор является основным сетевым протоколом Интернета. Однако это быстро меняется, и наш стек можно будет расширить поддержкой IPv6 в будущем. Internet Checksum Поле интернет-контрольной суммы используется для проверки целостности IP-дейтаграммы. Вычисление контрольной суммы относительно простое и определено в оригинальной спецификации: Поле контрольной суммы представляет собой 16-битное дополнение до единицы суммы всех 16-битных слов в заголовке. Для вычисления контрольной суммы значение этого поля принимается равным нулю. Фактический код для алгоритма выглядит следующим образом:

uint16_t checksum(void *addr, int count)
{
    /* Compute Internet Checksum for "count" bytes
     *         beginning at location "addr".
     * Taken from https://tools.ietf.org/html/rfc1071
     */

    register uint32_t sum = 0;
    uint16_t * ptr = addr;

    while( count > 1 )  {
        /*  This is the inner loop */
        sum += * ptr++;
        count -= 2;
    }

    /*  Add left-over byte, if any */
    if( count > 0 )
        sum += * (uint8_t *) ptr;

    /*  Fold 32-bit sum to 16 bits */
    while (sum>>16)
        sum = (sum & 0xffff) + (sum >> 16);

    return ~sum;
}
https://www.saminiir.com/lets-code-tcp-ip-stack-2-ipv4-icmpv4/ ➡️ @cpp_geek

Давай программировать стек TCP/IP. Part 1: Ethernet & ARP Написание собственного стека TCP/IP может показаться сложной задачей. Действительно, за более чем тридцать лет существования TCP накопилось множество спецификаций. Однако основная спецификация на удивление компактна — важные части включают разбор заголовков TCP, автомат конечных состояний, контроль перегрузок и вычисление времени ожидания повторной передачи. Наиболее распространенные протоколы второго и третьего уровней — Ethernet и IP, соответственно, — в сравнении с TCP гораздо проще. В этой серии статей мы реализуем минимальный стек TCP/IP в пространстве пользователя для Linux. Цель этих публикаций и создаваемого ПО исключительно образовательная — углубленное изучение сетевого и системного программирования. TUN/TAP устройства Чтобы перехватывать сетевой трафик низкого уровня из ядра Linux, мы будем использовать TAP-устройство Linux. Если кратко, TUN/TAP устройства часто применяются приложениями в пространстве пользователя для работы с трафиком на уровне L3 и L2 соответственно. Популярным примером является туннелирование, когда пакет инкапсулируется внутри полезной нагрузки другого пакета. Преимущество TUN/TAP устройств в том, что их легко настроить в программе в пространстве пользователя, и они уже используются во множестве программ, таких как OpenVPN. Поскольку мы хотим строить стек сетевого взаимодействия, начиная со второго уровня, нам потребуется TAP-устройство. Мы создаем его следующим образом:

/*
 * Taken from Kernel Documentation/networking/tuntap.txt
 */
int tun_alloc(char *dev)
{
    struct ifreq ifr;
    int fd, err;

    if( (fd = open("/dev/net/tap", O_RDWR)) < 0 ) {
        print_error("Cannot open TUN/TAP dev");
        exit(1);
    }

    CLEAR(ifr);

    /* Flags: IFF_TUN   - TUN device (no Ethernet headers)
     *        IFF_TAP   - TAP device
     *
     *        IFF_NO_PI - Do not provide packet information
     */
    ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
    if( *dev ) {
        strncpy(ifr.ifr_name, dev, IFNAMSIZ);
    }

    if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ){
        print_error("ERR: Could not ioctl tun: %s\n", strerror(errno));
        close(fd);
        return err;
    }

    strcpy(dev, ifr.ifr_name);
    return fd;
}
https://www.saminiir.com/lets-code-tcp-ip-stack-1-ethernet-arp/ ➡️ @cpp_geek

move constructor Move-конструктор — это специальный конструктор, который позволяет эффективно перемещать ресурсы из одного об
move constructor Move-конструктор — это специальный конструктор, который позволяет эффективно перемещать ресурсы из одного объекта в другой, без необходимости копирования данных. Он используется для реализации семантики перемещения (move semantics) и оптимизации работы с временными объектами. Move-конструктор принимает rvalue ссылку (&&) на объект, который будет перемещен, и выполняет простое копирование указателей на данные, а не их фактическое копирование. Использование move-конструктора позволяет избежать лишних копирований данных и повысить производительность при работе с большими или ресурсоемкими объектами. ➡️ @cpp_geek

Move-only объекты и почему std::unique_ptr нельзя копировать Многие удивляются, когда компилятор ругается: «unique_ptr не имеет конструктора копирования». Это не баг, а фича: он move-only. Логика простая: владелец ресурса должен быть только один.

#include <memory>
#include <iostream>

int main() {
    std::unique_ptr<int> p1 = std::make_unique<int>(42);

    // std::unique_ptr<int> p2 = p1; // ❌ ошибка копирования

    std::unique_ptr<int> p2 = std::move(p1); // ✅ перенос
    std::cout << *p2 << "\n"; // 42
    std::cout << (p1 ? "not null" : "null") << "\n"; // null
}
Ключевой момент: после std::move старый указатель «обнуляется», чтобы избежать двойного освобождения памяти. Если нужен shareable ресурс – используйте std::shared_ptr. Но помните: это дороже (счётчик ссылок, атомики). Частая ошибка на собеседованиях: «почему нельзя вернуть unique_ptr по значению?» - на самом деле можно! Он спокойно двигается:

std::unique_ptr<int> make_ptr() {
    return std::make_unique<int>(99); // move происходит неявно
}
👉 Правило: если объект владеет чем-то уникально – делайте его move-only (удалите копирование). Это повышает безопасность кода и явно выражает семантику владения. ➡️ @cpp_geek

memmove Функция memmove используется для копирования блока памяти из одного места в другое. Она объявлена в заголовочном файл
memmove Функция memmove используется для копирования блока памяти из одного места в другое. Она объявлена в заголовочном файле. Она принимает аргументы типа void * и const void *, что позволяет ей работать с любыми типами данных. Она просто копирует указанное количество байтов из исходного буфера в целевой. memmove может обрабатывать перекрывающиеся буферы. В отличие от memcpy, которая просто копирует данные из одного места в другое, memmove может безопасно перемещать данные, даже если исходный и целевой буферы перекрываются. Функция memmove может быть полезна для удаления элементов из массива. Например, если вы хотите удалить элемент из массива и сдвинуть оставшиеся элементы влево, вы можете использовать memmove для перемещения данных в массиве. ➡️ @cpp_geek

Генерируем пароли с помощью C++ Эта программа создает константы для допустимых символов в пароле и для длины пароля. Затем он
Генерируем пароли с помощью C++ Эта программа создает константы для допустимых символов в пароле и для длины пароля. Затем она инициализирует генератор случайных чисел и генерирует пять случайных паролей. Каждый пароль формируется путем выбора случайного символа из всего набора символов. Этот процесс повторяется до достижения желаемой длины пароля. ➡️ @cpp_geek

Сейчас покажу вам простой, но мощный приём для ускорения компиляции - разделение объявления и реализации шаблонов с использованием explicit instantiation. Все мы знаем, что шаблоны в C++ реализуются в заголовочных файлах. Это значит, что каждый .cpp файл, который включает такой заголовок, заново инстанцирует шаблон. Результат - долгое время компиляции и раздутый бинарник. 🔧 Что можно сделать? Разделяем интерфейс и реализацию:

// MyTemplate.hpp
#pragma once

template<typename T>
class MyTemplate {
public:
    void doSomething();
};

// MyTemplate.cpp
#include "MyTemplate.hpp"
#include <iostream>

template<typename T>
void MyTemplate<T>::doSomething() {
    std::cout << "Doing something\n";
}

// Явная инстанциация
template class MyTemplate<int>;
Теперь в клиентском коде:

#include "MyTemplate.hpp"

int main() {
    MyTemplate<int> obj;
    obj.doSomething();
}
✅ Это даст: - Сокращение времени компиляции - Чище зависимости - Потенциально меньший размер бинарника Но помните: explicit instantiation работает, только если вы заранее знаете типы, с которыми будете использовать шаблон. ➡️ @cpp_geek

Изменяемые лямбда-функции Ключевое слово mutable используется для сохранения состояния в лямбда-функциях. Обычно оператор выз
Изменяемые лямбда-функции Ключевое слово mutable используется для сохранения состояния в лямбда-функциях. Обычно оператор вызова функции замыкания является константным. Другими словами — лямбда не может модифицировать переменные, захваченные по значению. Но ключевое слово mutable может быть применено ко всей лямбда-функции, что сделает все её переменные изменяемыми. Следует заметить, что в отличии от mutable-переменных в объявлении класса, мутабельные лямбда-функции должны использоваться относительно редко и очень аккуратно. Сохранение состояния между вызовами лямбда-функции может быть опасным и контринтуитивным. ➡️ @cpp_geek