Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥8❤4
Например,
std::numeric_limits<T>::max() позволяет узнать максимальное значение типа, а std::numeric_limits<T>::lowest() — минимальное возможное значение.На картинке — краткая шпаргалка по целочисленным типам (int, long, uint64_t и другим), числам с плавающей точкой (float, double, long double) и возможностям
std::numeric_limits.Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤8🔥5
Почему std::vector::reserve может ускорить добавление элементов?
std::vector хранит элементы в непрерывном участке памяти.
Когда ты добавляешь новые элементы через push_back, вектор может понять, что места больше нет. Тогда ему приходится выделить новый участок памяти, перенести туда старые элементы и только потом добавить новый.
В маленьком примере это почти незаметно:
Но если элементов много, лишние перевыделения памяти могут замедлять программу.
Если ты заранее знаешь примерное количество элементов, можно вызвать reserve:
reserve не добавляет элементы в вектор. Он только заранее выделяет память.
После такого вызова:
размер всё ещё будет нулевым:
Если нужно именно создать 100 элементов, тогда используют resize:
📣 C++ Ready | #совет
std::vector хранит элементы в непрерывном участке памяти.
Когда ты добавляешь новые элементы через push_back, вектор может понять, что места больше нет. Тогда ему приходится выделить новый участок памяти, перенести туда старые элементы и только потом добавить новый.
В маленьком примере это почти незаметно:
std::vector<int> numbers;
for (int i = 0; i < 100; ++i) {
numbers.push_back(i);
}
Но если элементов много, лишние перевыделения памяти могут замедлять программу.
Если ты заранее знаешь примерное количество элементов, можно вызвать reserve:
std::vector<int> numbers;
numbers.reserve(100);
for (int i = 0; i < 100; ++i) {
numbers.push_back(i);
}
reserve не добавляет элементы в вектор. Он только заранее выделяет память.
После такого вызова:
std::vector<int> v;
v.reserve(100);
размер всё ещё будет нулевым:
std::cout << v.size() << '\n'; // 0
std::cout << v.capacity() << '\n'; // 100
Если нужно именно создать 100 элементов, тогда используют resize:
v.resize(100);
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤6👍5🤝1
Напоминалка по выбору контейнера в C++!
Например,
На картинке краткая схема выбора sequence-контейнера:
Сохрани, чтобы не потерять!
📣 C++ Ready | #ресурс
Например,
std::vector обычно подходит, когда нужен быстрый доступ по индексу и хранение элементов подряд в памяти, а std::deque удобен, если нужно эффективно добавлять элементы и в начало, и в конец.На картинке краткая схема выбора sequence-контейнера:
std::vector, std::deque, std::list, std::forward_list и std::array.Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤5🔥4😁1
Парсим числа из строки на чистом C++!
Иногда нужно разобрать строку с данными. Например числа из конфига, координаты, значения из файла или простую команду пользователя.
Есть строка:
Вручную искать пробелы и резать строку неудобно. Для таких задач можно использовать std::istringstream.
Создадим поток из строки:
Теперь из него можно читать значения так же, как из std::cin:
На выходе получим:
Это удобно, когда данные идут в простом текстовом формате и разделены пробелами, переносами строк или табами.
Например, так можно разобрать координаты:
Если строка содержит мусор вместо числа, чтение просто остановится, и это можно проверить:
📣 C++ Ready | #практика
Иногда нужно разобрать строку с данными. Например числа из конфига, координаты, значения из файла или простую команду пользователя.
Есть строка:
std::string text = "10 20 30 40";
Вручную искать пробелы и резать строку неудобно. Для таких задач можно использовать std::istringstream.
#include <iostream>
#include <sstream>
#include <string>
Создадим поток из строки:
std::istringstream input(text);
Теперь из него можно читать значения так же, как из std::cin:
int value;
while (input >> value) {
std::cout << value << '\n';
}
На выходе получим:
10
20
30
40
Это удобно, когда данные идут в простом текстовом формате и разделены пробелами, переносами строк или табами.
Например, так можно разобрать координаты:
std::string point = "15 42";
std::istringstream input(point);
int x;
int y;
input >> x >> y;
Если строка содержит мусор вместо числа, чтение просто остановится, и это можно проверить:
if (!(input >> value)) {
std::cout << "Invalid number\n";
}Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍9🔥6😁2
Корутины — это функции, выполнение которых можно приостанавливать и продолжать. Они позволяют писать асинхронный и ленивый код без громоздких колбэков и сложного состояния.
Что важно знать:
• Три ключевых оператора: co_await, co_yield, co_return.
• Можно создавать генераторы, которые возвращают значения по одному.
• Асинхронные функции выглядят как обычные — без вложенности и запутанных цепочек вызовов.
Это мощный инструмент современного C++, который легко интегрируется с другими фичами языка.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21❤6👍6
This media is not supported in your browser
VIEW IN TELEGRAM
Этот репозиторий отлично подойдёт тем, кто изучает алгоритмы, готовится к собеседованиям или хочет сильнее прокачать C++. Здесь собрано большое количество реализаций алгоритмов и структур данных с понятным кодом и хорошей организацией по темам. Можно не просто изучать теорию, а сразу смотреть, как алгоритмы реализуются на практике.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24❤4🔥4
Находим максимальный элемент через STL!
Иногда нужно найти самое большое значение: максимальную цену, лучший результат, самый длинный список или наибольший score.
Допустим, есть вектор чисел:
Можно искать максимум вручную:
Но в C++ для этого уже есть готовый алгоритм:
std::max_element возвращает итератор на максимальный элемент.
Поэтому перед использованием лучше проверить, что контейнер не пустой:
На выходе получим:
Если нужно искать максимум не по самому объекту, а по полю, можно передать компаратор:
Такой подход удобен для рейтингов, статистики, игр, отчётов и любых коллекций объектов.
📣 C++ Ready | #практика
Иногда нужно найти самое большое значение: максимальную цену, лучший результат, самый длинный список или наибольший score.
Допустим, есть вектор чисел:
std::vector<int> numbers = {5, 1, 9, 3};Можно искать максимум вручную:
int max_value = numbers[0];
for (int value : numbers) {
if (value > max_value) {
max_value = value;
}
}
Но в C++ для этого уже есть готовый алгоритм:
auto max_it = std::max_element(
numbers.begin(),
numbers.end()
);
std::max_element возвращает итератор на максимальный элемент.
Поэтому перед использованием лучше проверить, что контейнер не пустой:
if (max_it != numbers.end()) {
std::cout << *max_it << '\n';
}На выходе получим:
9
Если нужно искать максимум не по самому объекту, а по полю, можно передать компаратор:
auto best = std::max_element(
users.begin(),
users.end(),
[](const User& a, const User& b) {
return a.score < b.score;
}
);
Такой подход удобен для рейтингов, статистики, игр, отчётов и любых коллекций объектов.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍10🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
В этом репозитории собрана большая подборка материалов по современному C++: книги, статьи, видео, библиотеки и полезные инструменты для работы с C++11/14/17/20. Особенно полезен тем, кто хочет разобраться в STL, многопоточности, управлении памятью, шаблонах и современных практиках разработки.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤5👍3
Удаляем элементы из vector по условию в C++20!
Допустим, есть список чисел, и нужно удалить все чётные значения.
Раньше для такой задачи часто использовали erase-remove idiom:
Код рабочий, но выглядит тяжеловато, особенно для простой операции.
В C++20 появился более прямой вариант:
Функция удалит все элементы, для которых predicate вернёт true.
После выполнения в векторе останется:
Так можно удалять не только числа, но и объекты.
Например, убрать неактивных пользователей:
Это удобно для списков задач, событий, игровых объектов, очередей обработки и любых контейнеров, где нужно почистить элементы по условию.
📣 C++ Ready | #практика
Допустим, есть список чисел, и нужно удалить все чётные значения.
std::vector<int> nums = {1, 2, 3, 4, 5};Раньше для такой задачи часто использовали erase-remove idiom:
nums.erase(
std::remove_if(nums.begin(), nums.end(), [](int x) {
return x % 2 == 0;
}),
nums.end()
);
Код рабочий, но выглядит тяжеловато, особенно для простой операции.
В C++20 появился более прямой вариант:
std::erase_if(nums, [](int x) {
return x % 2 == 0;
});Функция удалит все элементы, для которых predicate вернёт true.
После выполнения в векторе останется:
1 3 5
Так можно удалять не только числа, но и объекты.
Например, убрать неактивных пользователей:
std::erase_if(users, [](const User& user) {
return !user.active;
});Это удобно для списков задач, событий, игровых объектов, очередей обработки и любых контейнеров, где нужно почистить элементы по условию.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍6🔥4
Напоминалка по std::string_view в C++!
Например, std::string_view позволяет передать строку без копирования, если функции нужно только прочитать текст.
На картинке шпаргалка по string_view: создание, доступ к символам, получение подстроки, сравнение и важные ограничения по времени жизни данных.
Сохрани, чтобы не потерять!
📣 C++ Ready | #ресурс
Например, std::string_view позволяет передать строку без копирования, если функции нужно только прочитать текст.
На картинке шпаргалка по string_view: создание, доступ к символам, получение подстроки, сравнение и важные ограничения по времени жизни данных.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤7🔥4
Менять vector во время обхода это плохая идея!
На первый взгляд код выглядит безобидно: идём по элементам и добавляем новые.
Но у std::vector есть важная особенность: при добавлении элементов он может перевыделить память.
То есть старый внутренний массив станет неактуальным, элементы переедут в новое место, а итераторы, ссылки и указатели могут стать недействительными.
Range-based for внутри тоже использует итераторы.
Поэтому менять размер vector во время такого обхода — опасный сценарий.
Лучше сначала запомнить исходный размер:
Теперь цикл обходит только старые элементы, а новые добавляются в конец и не влияют на количество итераций.
Если заранее понятно, сколько элементов добавится, можно ещё подготовить память:
Это уменьшит шанс лишних перевыделений.
Такая ошибка часто появляется при обработке очередей задач, графов, списков событий или генерации новых элементов на основе старых.
📣 C++ Ready | #совет
На первый взгляд код выглядит безобидно: идём по элементам и добавляем новые.
std::vector<int> v = {1, 2, 3};
for (int x : v) {
v.push_back(x);
}Но у std::vector есть важная особенность: при добавлении элементов он может перевыделить память.
То есть старый внутренний массив станет неактуальным, элементы переедут в новое место, а итераторы, ссылки и указатели могут стать недействительными.
Range-based for внутри тоже использует итераторы.
Поэтому менять размер vector во время такого обхода — опасный сценарий.
Лучше сначала запомнить исходный размер:
std::size_t n = v.size();
for (std::size_t i = 0; i < n; ++i) {
v.push_back(v[i]);
}
Теперь цикл обходит только старые элементы, а новые добавляются в конец и не влияют на количество итераций.
Если заранее понятно, сколько элементов добавится, можно ещё подготовить память:
v.reserve(v.size() * 2);
Это уменьшит шанс лишних перевыделений.
Такая ошибка часто появляется при обработке очередей задач, графов, списков событий или генерации новых элементов на основе старых.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤5👍3
Каждый найдет что-то по душе:
1202 ГБ — Python
1811 ГБ — Frontend
1100 ГБ — C / C++ / C#
804 ГБ — Java
411 ГБ — SQL & БД
309 ГБ — DevOps
998 ГБ — ИБ & Хакинг
773 ГБ — Kotlin / Swift
189 ГБ — PHP
201 ГБ — GoLang
170 ГБ — Rust
167 ГБ — QA / Тестирование
310 ГБ — 1C + Лицензии
495 ГБ — Машинное обучение
704 ГБ — Аналитика Данных
991 ГБ — Дизайн
Материалы в закрепе, постоянно пополняются👆🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
👎9
Сортируем контейнер через std::ranges::sort!
Допустим, есть вектор чисел, и нужно отсортировать его по возрастанию.
Раньше обычно писали так:
Работает, но приходится каждый раз передавать пару итераторов.
В C++20 можно использовать ranges-версию:
Теперь алгоритм принимает контейнер целиком.
После сортировки получим:
Если нужно отсортировать объекты по полю, можно использовать projection:
Здесь сортировка идёт не по всему объекту, а по полю
Это удобно для рейтингов, таблиц лидеров, списков товаров, отчётов и любых коллекций, где нужно быстро упорядочить данные.
📣 C++ Ready | #практика
Допустим, есть вектор чисел, и нужно отсортировать его по возрастанию.
std::vector<int> nums = {4, 1, 7, 3};Раньше обычно писали так:
std::sort(nums.begin(), nums.end());
Работает, но приходится каждый раз передавать пару итераторов.
В C++20 можно использовать ranges-версию:
std::ranges::sort(nums);
Теперь алгоритм принимает контейнер целиком.
После сортировки получим:
1 3 4 7
Если нужно отсортировать объекты по полю, можно использовать projection:
std::ranges::sort(users, {}, &User::score);Здесь сортировка идёт не по всему объекту, а по полю
score.Это удобно для рейтингов, таблиц лидеров, списков товаров, отчётов и любых коллекций, где нужно быстро упорядочить данные.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥7❤3