Функция 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 и посмотреть, как они могут облегчить жизнь.
Кстати, а у вас в команде кто-нибудь ещё пишет свои трейты или все уже перешли на концепты?
Сегодня прочитал пост Вани Ходора (бэкенд-разраб из Лавки) про 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 и посмотреть, как они могут облегчить жизнь.
Кстати, а у вас в команде кто-нибудь ещё пишет свои трейты или все уже перешли на концепты?
Telegraph
Микрогайд по type_traits
<type_traits> -- хедер стандартной библиотеки, являющийся частью библиотеки для метапрограммирования. Я не буду вам пояснять принципы работы тех или иных трейтов. Мы не будем разбираться в том, что такое using, наследование, как выбирается специализация…
#вопросы_с_собеседований
Как подсчитать количество элементов в std::list?
Чтобы подсчитать количество элементов в std::list, можно использовать следующие способы:
1. Вызвать метод size() самого списка. Он вернет количество элементов.
2. Проитерировать список циклом и считать элементы.
3. Воспользоваться алгоритмом std::distance, передав ему начало и конец списка.
4. Применить алгоритм std::count_if с условием, которое всегда истинно.
Как подсчитать количество элементов в std::list?
1. Вызвать метод size() самого списка. Он вернет количество элементов.
2. Проитерировать список циклом и считать элементы.
3. Воспользоваться алгоритмом std::distance, передав ему начало и конец списка.
4. Применить алгоритм std::count_if с условием, которое всегда истинно.
spaceship operator
Spaceship operator (<=>) — это оператор сравнения, введенный в C++20.
Преимущества spaceship operator:
— Позволяет создавать типы, которые можно сравнивать с помощью одного оператора вместо нескольких (==, !=, <, > и т. д.).
— Упрощает написание функций сравнения, например
— Читабельнее и компактнее кода с традиционными операторами сравнения.
Spaceship operator (<=>) — это оператор сравнения, введенный в C++20.
Преимущества spaceship operator:
— Позволяет создавать типы, которые можно сравнивать с помощью одного оператора вместо нескольких (==, !=, <, > и т. д.).
— Упрощает написание функций сравнения, например
std::sort
.— Читабельнее и компактнее кода с традиционными операторами сравнения.
#вопросы_с_собеседований
Что случится, если вернуть ссылку на временный объект?
Если вернуть ссылку на временный объект, созданный в стеке, то это приведет к неопределенному поведению программы.
После выхода из функции память, выделенная под временный объект, освобождается. И если где-то сохранилась ссылка на этот объект, то при попытке обратиться к нему произойдет ошибка.
Что случится, если вернуть ссылку на временный объект?
После выхода из функции память, выделенная под временный объект, освобождается. И если где-то сохранилась ссылка на этот объект, то при попытке обратиться к нему произойдет ошибка.
Концепт IterToComparable
Концепт IterToComparable появился в стандарте C++20 и используется для проверки того, что итератор указывает на объекты, которые можно сравнивать.
Этот концепт позволяет убедиться, что можно сравнивать объекты, на которые ссылается итератор, с помощью операторов сравнения как
В примере используется концепт
Концепт IterToComparable появился в стандарте C++20 и используется для проверки того, что итератор указывает на объекты, которые можно сравнивать.
Этот концепт позволяет убедиться, что можно сравнивать объекты, на которые ссылается итератор, с помощью операторов сравнения как
<
, <=
, >
, >=
.В примере используется концепт
iter_to_comparable
для проверки, что итератор по std::vector
указывает на сравнимые объекты int
. Это позволяет корректно найти минимальный элемент с помощью std::min_element
.Библиотека концепций
Библиотека концепций — это набор функций и классов, которые позволяют определять и проверять концепции. Концепция — это набор логических предикатов, которые определяют свойства типа или выражения. Концепции могут использоваться для проверки типов параметров шаблонов, определения совместимости типов и повышения безопасности и надежности кода.
Библиотека концепций была введена в стандарт C++ 20. Она основана на концепциих Boost, которые были реализованы в библиотеке Boost еще в 2005 году.
#для_продвинутых
Библиотека концепций — это набор функций и классов, которые позволяют определять и проверять концепции. Концепция — это набор логических предикатов, которые определяют свойства типа или выражения. Концепции могут использоваться для проверки типов параметров шаблонов, определения совместимости типов и повышения безопасности и надежности кода.
Библиотека концепций была введена в стандарт 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
• Разработка и поддержка сложных интерфейсов встроенных систем
💼 Условия работы:
• Гибкий формат: удалённо или в офисах в Москве, Санкт-Петербурге, Екатеринбурге, Нижнем Новгороде и Минске
• Работа с масштабными проектами в уникальной команде инженеров
• Возможность горизонтального и вертикального карьерного роста
💙 Узнайте больше и откликайтесь на вакансии прямо на сайте!
Если вы хотите создавать сложное программное обеспечение для серверов и систем хранения данных, работать с передовыми технологиями 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++ представляют собой технику проектирования, при которой поведение класса параметризуется через шаблоны. Это позволяет программистам выбирать или изменять аспекты поведения класса на этапе компиляции, вставляя разные "политики" — это могут быть классы или функции, определяющие определённые аспекты поведения. Этот подход способствует гибкости и повторному использованию кода, позволяя композицию поведения вместо жёсткого наследования. Он также помогает уменьшить связность кода и увеличивает его модульность, поскольку изменения в одной политике не влияют на другие.
Объясните концепцию и применение шаблонов политик в C++ и как они способствуют принципам проектирования, основанным на композиции вместо наследования
Шаблоны политик в C++ представляют собой технику проектирования, при которой поведение класса параметризуется через шаблоны. Это позволяет программистам выбирать или изменять аспекты поведения класса на этапе компиляции, вставляя разные "политики" — это могут быть классы или функции, определяющие определённые аспекты поведения. Этот подход способствует гибкости и повторному использованию кода, позволяя композицию поведения вместо жёсткого наследования. Он также помогает уменьшить связность кода и увеличивает его модульность, поскольку изменения в одной политике не влияют на другие.
Офер в Яндекс за 48 часов: ищем бэкендеров
В команду нужны опытные бэкенд-разработчики на C++, Python, Java и Go. Приглашаем на Мультитрек — онлайн-программу быстрой адаптации.
Всего за 2 дня вы можете получить офер:
• До 18 августа подать заявку и пройти предварительный отбор
• 23 августа решить задачи на технических секциях
• 24 августа пройти финальное собеседование и получить офер
После этого будет возможность поработать с тремя командами и выбрать проект по душе.
Создаём технологии, которые меняют мир. Присоединяйтесь! Оставляйте заявку на сайте.
В команду нужны опытные бэкенд-разработчики на C++, Python, Java и Go. Приглашаем на Мультитрек — онлайн-программу быстрой адаптации.
Всего за 2 дня вы можете получить офер:
• До 18 августа подать заявку и пройти предварительный отбор
• 23 августа решить задачи на технических секциях
• 24 августа пройти финальное собеседование и получить офер
После этого будет возможность поработать с тремя командами и выбрать проект по душе.
Создаём технологии, которые меняют мир. Присоединяйтесь! Оставляйте заявку на сайте.
input_iterator
В C++ понятие итератора используется для доступа к элементам контейнера. Итераторы могут быть разных типов, каждый из которых имеет свои собственные свойства и ограничения.
Итератор
Итераторы
— Они должны поддерживать оператор *, который возвращает значение элемента, на который указывает итератор.
— Они должны поддерживать оператор ++, который перемещает итератор на следующий элемент контейнера.
#для_начинающих
В 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 августа включительно
E-CUP 2025 — соревнование, где Everything as code. Решай ML-задачи в стиле Ozon Tech. Призовой фонд — 7 200 000 рублей 🔥
Хочешь участвовать, но не знаешь, с чего начать? Codenrock подготовил курс для новичков — простой и понятный разбор типичных задач, форматов и подходов в машинном обучении. Регистрируйся, изучай и побеждай!
Что вас ждёт:
🔹 Работа над проектом для миллионов пользователей на основе данных от ведущего 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()
Функция
Функция принимает два аргумента:
Если оба аргумента равны, функция возвращает y, преобразованное к типу возвращаемого значения.
Возвращаемое значение:
Следующее представимое значение после
Если
#для_продвинутых
Функция
std::nexttoward()
возвращает следующее представимое значение после x
в направлении y
. Эта функция ведет себя аналогично функции std::nextafter()
, но с потенциально более точным y
.Функция принимает два аргумента:
x
— базовое значениеy
— значение, к которому приближается возвращаемое значениеЕсли оба аргумента равны, функция возвращает y, преобразованное к типу возвращаемого значения.
Возвращаемое значение:
Следующее представимое значение после
x
в направлении y
.Если
x
— это наибольшее конечное значение, представимое в типе, и результат бесконечен или не представим, возникает ошибка переполнения диапазона.#для_продвинутых