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

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

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

В C++ класс std::priority_queue из заголовка <queue> представляет собой контейнер с приоритетной очередью. Элементы извлекаются в порядке приоритета — по умолчанию, от большего к меньшему.

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

Что такое перемещение (move semantics) в C++11, как оно работает, и зачем нужен конструктор перемещения?

Ответ ⬇️
Перемещение — это оптимизация, которая позволяет передавать ресурсы (например, память или файлы) из одного объекта в другой без копирования, с помощью конструктора перемещения или оператора перемещения. Это достигается использованием std::move, который превращает объект в rvalue-ссылку, указывающую на временный объект. Конструктор перемещения предотвращает дорогостоящие копирования, делая код более производительным.

Пример использования ⚙️
#include <iostream>
#include <vector>
#include <utility> // Для std::move

class MyVector {
private:
int* data;
size_t size;

public:
// Конструктор
MyVector(size_t n) : size(n), data(new int[n]) {
std::cout << "Конструктор\n";
}

// Конструктор перемещения
MyVector(MyVector&& other) noexcept : size(other.size), data(other.data) {
other.data = nullptr; // Передаем ресурсы и обнуляем указатель у источника
other.size = 0;
std::cout << "Конструктор перемещения\n";
}

// Деструктор
~MyVector() {
delete[] data;
std::cout << "Деструктор\n";
}
};

int main() {
MyVector vec1(10); // Создаем объект
MyVector vec2 = std::move(vec1); // Используем конструктор перемещения

// vec1 больше не владеет ресурсами
return 0;
}

// Результат выполнения:
// Конструктор
// Конструктор перемещения
// Деструктор (vec1, ресурсы уже перенесены)
// Деструктор (vec2)


Если вдруг не поняли, можешь почитать подробное объяснение здесь.

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

Класс std::set из заголовка <set> представляет собой контейнер, хранящий уникальные элементы в отсортированном порядке. Это удобно для работы с множествами или быстрого поиска.

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

Функция std::rotate из заголовка циклически перемещает элементы в контейнере. Это удобно для сдвига массива или перестановки элементов.

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

Пояснение ⬇️

Оператор + перегружен для класса MyClass, он складывает значения value объектов a и b. Новый объект c создаётся с результатом 10 + 20 = 30, который выводится.


C++ Learning 👩‍💻
👩‍💻 Обучение программированию с нуля

Друзья, появился новый канал по обучению разных IT технологий.

Изучение Python
Изучение JavaScript
Изучение HTML/CSS
Изучение Java
Изучение C/С++
Изучение С#
Изучение SQL

👉 Подписывайся на TechVibe, будет интересно.
⚙️ 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 👩‍💻