C++ Эволюция
2.72K subscribers
296 photos
2 videos
106 links
Обучающий канал по C++
Download Telegram
⚙️ std::reverse

В C++ функция std::reverse из заголовка <algorithm> позволяет изменить порядок элементов в контейнере на обратный. Это полезно для работы с массивами, векторами и другими последовательностями.

C++ Learning 👩‍💻
⚙️ std::reverse

В C++ функция std::reverse из заголовка <algorithm> позволяет изменить порядок элементов в контейнере на обратный. Это полезно для работы с массивами, векторами и другими последовательностями.

C++ Learning 👩‍💻
Вопрос на собеседовании

Что такое perfect forwarding в C++, как оно работает и зачем оно нужно?

Ответ ⬇️
Perfect forwarding — это техника передачи аргументов в функции или конструкторы так, чтобы сохранить их исходные квалификаторы (например, lvalue, rvalue). Она достигается с помощью универсальных ссылок (T&&) и функции std::forward. Perfect forwarding используется для передачи аргументов в шаблонных функциях без лишних копирований.

Пример использования ⚙️
#include <iostream>
#include <utility>

void process(int& x) {
std::cout << "Lvalue: " << x << "\n";
}

void process(int&& x) {
std::cout << "Rvalue: " << x << "\n";
}

template <typename T>
void forwarder(T&& arg) {
process(std::forward<T>(arg));
}

int main() {
int a = 42;

forwarder(a); // Передаем lvalue
forwarder(100); // Передаем rvalue
return 0;
}


C++ Learning 👩‍💻
⚙️ std::replace

В C++ функция std::replace из заголовка <algorithm> заменяет все вхождения указанного значения на новое значение в заданном диапазоне. Это полезно для массовой замены элементов в контейнерах.

C++ Learning 👩‍💻
⚙️ std::ceil и std::floor

В C++ функции std::ceil и std::floor из заголовка <cmath> используются для округления числа вверх или вниз до ближайшего целого. Это полезно для контроля направления округления.

C++ Learning 👩‍💻
Abseil

Abseil — это набор библиотек общего назначения для C++, открытый компанией Google. Он предназначен для расширения возможностей стандартной библиотеки C++ и включает в себя хорошо протестированный код, используемый во внутренних проектах Google.

Стоит отметить, что Abseil не является заменой стандартной библиотеки C++. Google скорее делится своим полезным и проверенным кодом с сообществом разработчиков.

C++ Learning 👩‍💻
⚙️ std::vector::insert

В C++ метод std::vector::insert позволяет вставлять элементы или диапазоны элементов в вектор на указанную позицию. Это полезно для динамического изменения содержимого контейнера.

C++ Learning 👩‍💻
Вопрос на собеседовании

Что такое шаблонный метод std::enable_if в C++, как он работает, и в каких случаях его полезно использовать?

Ответ ⬇️
std::enable_if — это шаблонный механизм SFINAE (Substitution Failure Is Not An Error), позволяющий включать или отключать функции или классы на этапе компиляции в зависимости от выполнения условий. Это полезно для создания перегрузок шаблонов или ограничения их использования для определённых типов.

Пример использования ⚙️
#include <iostream>
#include <type_traits>

// Шаблон для целых чисел
template <typename T>
typename std::enable_if<std::is_integral<T>::value, void>::type
printType(T value) {
std::cout << "Целое число: " << value << "\n";
}

// Шаблон для чисел с плавающей точкой
template <typename T>
typename std::enable_if<std::is_floating_point<T>::value, void>::type
printType(T value) {
std::cout << "Число с плавающей точкой: " << value << "\n";
}

int main() {
printType(42); // Целое число: 42
printType(3.14); // Число с плавающей точкой: 3.14
// printType("Test"); // Ошибка компиляции: шаблон не подходит
}


C++ Learning 👩‍💻
⚙️ std::vector::resize

В C++ метод std::vector::resize изменяет размер вектора. Если новый размер больше текущего, добавляются элементы с дефолтным значением. Если меньше — лишние элементы удаляются.

C++ Learning 👩‍💻
⚙️ std::set_intersection

В C++ функция std::set_intersection из заголовка <algorithm> позволяет найти пересечение двух отсортированных контейнеров. Результат записывается в другой контейнер.

C++ Learning 👩‍💻
⚙️ std::adjacent_find

В C++ функция std::adjacent_find из заголовка <algorithm> ищет первый элемент в контейнере, который имеет соседний элемент с таким же значением или удовлетворяет заданному условию. Это удобно для обнаружения повторений или паттернов.

C++ Learning 👩‍💻
👩‍💻 Задача по C++: Удаление дубликатов из вектора с сохранением порядка

Напишите функцию, которая принимает std::vector и возвращает новый std::vector, содержащий только уникальные элементы, сохраняя их порядок появления.

Пример:

#include <iostream>
#include <vector>

int main() {
std::vector<int> numbers = {1, 2, 2, 3, 4, 3, 5, 1};
auto result = removeDuplicates(numbers);

for (int num : result) {
std::cout << num << " ";
}
// Ожидаемый результат: 1 2 3 4 5
return 0;
}


Решение задачи на картинке

C++ Learning 👩‍💻
⚙️ std::bind

В C++ функция std::bind из заголовка <functional> позволяет создавать обёртки для функций, связывая определённые аргументы. Это удобно для частичного применения аргументов.

C++ Learning 👩‍💻
Что будет выведено при выполнении кода?

Пояснение ⬇️

Метод show в Base объявлен как виртуальный, поэтому вызов obj->show() через указатель Base* вызывает переопределённую версию Derived show. Однако метод display не виртуальный, поэтому вызов obj->display() вызывает версию из Base. Код компилируется и работает корректно.


C++ Learning 👩‍💻
⚙️ std::partition

В C++ функция std::partition из заголовка <algorithm> разделяет элементы контейнера на две группы: те, которые удовлетворяют заданному условию, и те, которые не удовлетворяют. Это полезно для фильтрации данных.

C++ Learning 👩‍💻
⚙️ std::partial_sort

В C++ функция std::partial_sort из заголовка <algorithm> сортирует только часть контейнера, оставляя элементы до заданной позиции отсортированными, а остальные — в неопределённом порядке. Это эффективно, если нужно найти несколько наименьших или наибольших элементов.

C++ Learning 👩‍💻
⚙️ std::merge

В C++ функция std::merge из заголовка <algorithm> объединяет два отсортированных диапазона в один отсортированный. Это полезно для слияния данных из двух контейнеров.

C++ Learning 👩‍💻
Вопрос на собеседовании

Что такое emplace в C++ и чем оно отличается от push_back при работе с контейнерами STL?

Ответ ⬇️
Метод emplace добавляет новый элемент в контейнер, создавая его непосредственно на месте, вместо создания временного объекта и его копирования (как в случае с push_back). Это повышает производительность, особенно при добавлении сложных объектов. Метод emplace вызывает конструктор объекта с переданными аргументами прямо в памяти контейнера.

Пример использования ⚙️
#include <iostream>
#include <vector>
#include <string>

class MyClass {
public:
MyClass(const std::string& name, int value) : name(name), value(value) {
std::cout << "Создан объект: " << name << " со значением " << value << "\n";
}

private:
std::string name;
int value;
};

int main() {
std::vector<MyClass> vec;

// Используем push_back
vec.push_back(MyClass("Object1", 10)); // Создаётся временный объект

// Используем emplace
vec.emplace_back("Object2", 20); // Объект создаётся сразу в контейнере

return 0;
}


C++ Learning 👩‍💻
Что будет выведено при выполнении кода?

Пояснение ⬇️

std::move преобразует объект obj1 в rvalue-ссылку. Это вызывает конструктор перемещения, который перемещает значение из obj1 в obj2. После перемещения obj1.value становится 0, а obj2.value — 10. Код компилируется и выполняется корректно.


C++ Learning 👩‍💻
⚙️ std::generate_n

В C++ функция std::generate_n из заголовка <algorithm> используется для заполнения заданного количества элементов последовательности, используя функцию-генератор. Это удобно для инициализации контейнеров или создания данных на лету.

C++ Learning 👩‍💻
⚙️ std::find

В C++ функция std::find из заголовка <algorithm> используется для поиска первого вхождения заданного значения в диапазоне. Это полезно для работы с последовательными контейнерами, такими как массивы или векторы.

C++ Learning 👩‍💻