Senior C++ Developer
13.1K subscribers
1.24K photos
4 videos
573 links
№ 4931128893
Изучаем C++.

По вопросам сотрудничества: @adv_and_pr
加入频道
Функция resize

Функция resize служит для изменения размера контейнеров, например вектора или deque.
Она динамически меняет количество элементов в контейнере на указанное число.

Например, для вектора numbers вызов:
numbers.resize(100);

Установит размер вектора в 100 элементов.
Если изначально элементов было меньше — новые будут инициализированы по умолчанию (нулями). Если было больше — лишние удалятся.

Также можно явно задать значение для инициализации:
numbers.resize(80, -1);

Также resize принимает вектор-шаблон для копирования значений при расширении.

#это_база
Немного про метапрограммирование и эстетическое удовольствие от type_traits

Сегодня прочитал пост Вани Ходора (бэкенд-разраб из Лавки) про type traits — небольшой гайд, который наверняка вызовет ностальгию у тех, кто когда-то лепил свои std::enable_if, is_same, remove_cvref, потому что библиотека ещё была до C++14 и приходилось всё тащить на себе.

Казалось бы, type_traits — довольно скучная часть стандартной библиотеки. Но чем больше работаешь с шаблонным кодом, тем чаще ловишь себя на том, что это не просто утилиты, а строительные блоки для архитектуры. И да, некоторые из них прямо эстетически красивые.

Из любимого — std::is_invocable, std::is_detected, std::conditional_t, std::void_t. Когда видишь, как эти трейты могут элегантно разрулить перегрузку, или сделать fallback на дефолтную реализацию без лишних ифов — это как хорошо написанная лямбда: вроде ничего особенного, а работает идеально.

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

В целом, type_traits — это, по сути, DSL на минималках. Если подходить к ним не как к синтаксическому сахару, а как к способу выразить правила типов прямо в коде — открывается совсем другой уровень выразительности. Особенно если ты пишешь свои обёртки, декораторы или generic-компоненты.

👴 Помню времена, когда std::enable_if приходилось объяснять джунам с доской и маркером. Сейчас это уже почти common sense. И это хорошо — потому что без этой базы метапрограммировать тяжело.

В общем, рекомендую почитать — вдруг тоже вспомните свои любимые трейты. А если нет — повод попробовать std::is_aggregate или std::is_trivially_copyable и посмотреть, как они могут облегчить жизнь.

Кстати, а у вас в команде кто-нибудь ещё пишет свои трейты или все уже перешли на концепты?
#вопросы_с_собеседований
Как подсчитать количество элементов в std::list?

Чтобы подсчитать количество элементов в std::list, можно использовать следующие способы:

1. Вызвать метод size() самого списка. Он вернет количество элементов.
2. Проитерировать список циклом и считать элементы.
3. Воспользоваться алгоритмом std::distance, передав ему начало и конец списка.
4. Применить алгоритм std::count_if с условием, которое всегда истинно.
spaceship operator

Spaceship operator (<=>) — это оператор сравнения, введенный в C++20.

Преимущества spaceship operator:
— Позволяет создавать типы, которые можно сравнивать с помощью одного оператора вместо нескольких (==, !=, <, > и т. д.).
— Упрощает написание функций сравнения, например std::sort.
— Читабельнее и компактнее кода с традиционными операторами сравнения.
#вопросы_с_собеседований
Что случится, если вернуть ссылку на временный объект?

Если вернуть ссылку на временный объект, созданный в стеке, то это приведет к неопределенному поведению программы.

После выхода из функции память, выделенная под временный объект, освобождается. И если где-то сохранилась ссылка на этот объект, то при попытке обратиться к нему произойдет ошибка.
Концепт IterToComparable

Концепт IterToComparable появился в стандарте C++20 и используется для проверки того, что итератор указывает на объекты, которые можно сравнивать.

Этот концепт позволяет убедиться, что можно сравнивать объекты, на которые ссылается итератор, с помощью операторов сравнения как <, <=, >, >=.

В примере используется концепт iter_to_comparable для проверки, что итератор по std::vector указывает на сравнимые объекты int. Это позволяет корректно найти минимальный элемент с помощью std::min_element.
Библиотека концепций

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

Библиотека концепций была введена в стандарт C++ 20. Она основана на концепциих Boost, которые были реализованы в библиотеке Boost еще в 2005 году.

#для_продвинутых
Media is too big
VIEW IN TELEGRAM
🚀 YADRO приглашает C++ разработчиков в команду OpenBMC и встроенных систем!

Если вы хотите создавать сложное программное обеспечение для серверов и систем хранения данных, работать с передовыми технологиями Linux и участвовать в проектах open source, то эта возможность для вас.

📌 Кого мы ищем:

• Ведущего разработчика C++ (Linux/OpenBMC)
• Ведущего разработчика интерфейсов встроенных систем
• TeamLead разработки OpenBMC

🧰 Технологический стек и задачи:

• C++ (стандарты 17, 20, 23), STL, Boost
• Linux-среда, systemd, D-Bus, Yocto, bash, Python
• Работа с ядром прошивки OpenBMC, взаимодействие с UEFI/BIOS
• Разработка и поддержка сложных интерфейсов встроенных систем

💼 Условия работы:

• Гибкий формат: удалённо или в офисах в Москве, Санкт-Петербурге, Екатеринбурге, Нижнем Новгороде и Минске
• Работа с масштабными проектами в уникальной команде инженеров
• Возможность горизонтального и вертикального карьерного роста

💙 Узнайте больше и откликайтесь на вакансии прямо на сайте!
Please open Telegram to view this post
VIEW IN TELEGRAM
std::thread

std::thread — это класс из стандартной библиотеки С++, который представляет собой поток выполнения. Потоки выполнения — это независимые единицы, которые могут выполняться параллельно друг с другом.

Чтобы создать поток, можно использовать конструктор класса std::thread. Конструктор принимает в качестве аргумента указатель на функцию или объект, который будет выполняться в потоке.

В примере на картинке функция foo() будет выполняться в отдельном потоке. После создания потока мы вызываем его метод join(), чтобы дождаться его завершения.

#для_начинающих
#вопросы_с_собеседований
Объясните концепцию и применение шаблонов политик в C++ и как они способствуют принципам проектирования, основанным на композиции вместо наследования


Шаблоны политик в C++ представляют собой технику проектирования, при которой поведение класса параметризуется через шаблоны. Это позволяет программистам выбирать или изменять аспекты поведения класса на этапе компиляции, вставляя разные "политики" — это могут быть классы или функции, определяющие определённые аспекты поведения. Этот подход способствует гибкости и повторному использованию кода, позволяя композицию поведения вместо жёсткого наследования. Он также помогает уменьшить связность кода и увеличивает его модульность, поскольку изменения в одной политике не влияют на другие.
Офер в Яндекс за 48 часов: ищем бэкендеров

В команду нужны опытные бэкенд-разработчики на C++, Python, Java и Go. Приглашаем на Мультитрек — онлайн-программу быстрой адаптации.

Всего за 2 дня вы можете получить офер:
• До 18 августа подать заявку и пройти предварительный отбор
• 23 августа решить задачи на технических секциях
• 24 августа пройти финальное собеседование и получить офер
После этого будет возможность поработать с тремя командами и выбрать проект по душе.

Создаём технологии, которые меняют мир. Присоединяйтесь! Оставляйте заявку на сайте.
input_iterator

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

Итератор input_iterator представляет собой итератор, который может только читать значения элементов контейнера. Он не может их изменять.

Итераторы input_iterator должны удовлетворять следующим требованиям:
— Они должны поддерживать оператор *, который возвращает значение элемента, на который указывает итератор.
— Они должны поддерживать оператор ++, который перемещает итератор на следующий элемент контейнера.

#для_начинающих
E-CUP возвращается. Реальные данные. Масштабные проекты. Большие призы

E-CUP 2025 — соревнование, где Everything as code. Решай ML-задачи в стиле Ozon Tech. Призовой фонд — 7 200 000 рублей 🔥

Хочешь участвовать, но не знаешь, с чего начать? Codenrock подготовил курс для новичков — простой и понятный разбор типичных задач, форматов и подходов в машинном обучении. Регистрируйся, изучай и побеждай!

🗓 Регистрация: https://cnrlink.com/ecup25seniorcplus
💻 Формат участия: онлайн
👥 Команда: от 1 до 5 человек
🎯 Для кого: Data Scientists, ML-специалисты, аналитики данных, дата-инженеры, специалисты Big Data и разработчики, которые интересуются ML/DS.

Что вас ждёт:
🔹 Работа над проектом для миллионов пользователей на основе данных от ведущего e-com в России.
🔹 Призовой фонд — 7 200 000 рублей для девяти сильнейших команд.
🔹 Обмен опытом с экспертами Ozon Tech.
🔹 Эксклюзивный мерч и подарки.
🔹 Питчинг — онлайн или очно на конференции E-CODE. Финалистам Ozon Tech предоставит билеты и оплатит поездку.

Регистрация открыта до 17 августа включительно
Please open Telegram to view this post
VIEW IN TELEGRAM
std::semaphore

std::semaphore — это класс шаблона в C++ <semaphore>, представляющий собой примитив синхронизации, который позволяет контролировать доступ к совместно используемым ресурсам. В отличие от std::mutex, std::semaphore позволяет более чем одному потоку одновременно обращаться к одному и тому же ресурсу, но не более, чем указано в конструкторе.

std::semaphore имеет два основных метода:

acquire() — блокирует поток, пока значение счетчика семафора не станет ненулевым.
release() — увеличивает значение счетчика семафора на единицу.

В примере на картинке два потока пытаются получить доступ к ресурсу. Первый поток получает доступ к ресурсу, используя acquire(), и освобождает его, используя release(). Второй поток также пытается получить доступ к ресурсу, но блокируется, пока первый поток не освободит его. После того, как первый поток освободит ресурс, второй поток также сможет получить к нему доступ.

#для_продвинутых
std::sort

std::sort — это функция стандартной библиотеки C++, которая сортирует диапазон элементов. Функция принимает три параметра:

Начальный итератор — указывает на начало диапазона элементов, который необходимо отсортировать.
Конечный итератор — указывает на конец диапазона элементов, который необходимо отсортировать.
Компаратор — функция, которая определяет, какой элемент из двух меньше или равен другому.

Если компаратор не указан, то функция использует стандартную лексикографическую сортировку.

#для_продвинутых
Функция strlen()

Функция strlen() в языке программирования C++ используется для определения длины строки. Она принимает в качестве аргумента указатель на строку и возвращает значение типа size_t, которое представляет собой количество символов в строке, включая нулевой символ \0, который завершает строку.

Синтаксис функции strlen():
size_t strlen(const char* str);


Аргументы:
str — указатель на строку, длина которой должна быть определена.

Возвращаемое значение:
Количество символов в строке, включая нулевой символ \0.
std::utility

std::utility — это пространство имен в стандартном заголовочном файле <utility>, которое содержит шаблоны функций и классов, которые предоставляют различные полезные утилиты для работы с данными.

Одним из наиболее важных шаблонов в std::utility является шаблон класса pair, который представляет собой пару значений. pair может использоваться для хранения двух значений любого типа.

#для_продвинутых
std::greater

Шаблон std::greater представляет собой функциональный объект, который используется для сравнения двух объектов по возрастанию. Он является базовым классом для всех функциональных объектов, которые выполняют сравнение по возрастанию, например, std::less, std::greater_equal, std::less_equal.

Функциональный объект std::greater имеет один метод, operator(), который принимает два аргумента типа T и возвращает значение типа bool. Значение true возвращается, если первый аргумент больше второго, и значение false — в противном случае.

#для_продвинутых
Функция std::adjacent_difference()

Функция std::adjacent_difference() из библиотеки стандартных алгоритмов C++ вычисляет последовательные различия между каждым элементом и его предшественником в входном диапазоне. Результаты выводятся в диапазон назначения.

Сигнатура функции:

template <class InputIt, class OutputIt>
OutputIt adjacent_difference(InputIt first, InputIt last, OutputIt d_first);


#для_продвинутых
std::nexttoward()

Функция std::nexttoward() возвращает следующее представимое значение после x в направлении y. Эта функция ведет себя аналогично функции std::nextafter(), но с потенциально более точным y.

Функция принимает два аргумента:

x — базовое значение
y — значение, к которому приближается возвращаемое значение

Если оба аргумента равны, функция возвращает y, преобразованное к типу возвращаемого значения.

Возвращаемое значение:

Следующее представимое значение после x в направлении y.
Если x — это наибольшее конечное значение, представимое в типе, и результат бесконечен или не представим, возникает ошибка переполнения диапазона.

#для_продвинутых