Please open Telegram to view this post
VIEW IN TELEGRAM
scoped_lock
происходит захват всех переданных мьютексов, а при выходе из области видимости — их автоматическое освобождение.
std::mutex mtx1, mtx2;
{
std::scoped_lock lock(mtx1, mtx2); // Захватывает оба мьютекса
// Критическая секция
} // Мьютексы автоматически освобождаются
Использование
scoped_lock
особенно полезно в ситуациях, где требуется захватить несколько мьютексов одновременно, обеспечивая безопасность и удобство.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
int x = 10;
decltype(x) y = 20; // Тип y будет int, так как тип x — int
decltype
также учитывает категорию значения (lvalue, rvalue), что делает его полезным для точного определения типов в сложных сценариях. Например, при работе с возвращаемыми значениями функций или выражениями.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1. Единообразие интерфейса: Использование стандартных HTTP-методов (GET, POST, PUT, DELETE) для выполнения операций.
2. Отсутствие состояния: Каждый запрос содержит всю информацию, необходимую для его обработки.
3. Кэширование: Ответы могут быть кэшируемыми для повышения производительности.
4. Клиент-серверная архитектура: Четкое разделение между клиентом и сервером.
5. Слоистая система: Возможность использования промежуточных слоев (прокси, шлюзы) без изменения интерфейса.
// Пример HTTP-запроса GET для получения данных
GET /api/resource/123 HTTP/1.1
Host: example.com
RESTful API широко используется благодаря своей простоте, масштабируемости и удобству интеграции.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Деструктор имеет имя, совпадающее с именем класса, но с тильдой (~) в начале. У него нет возвращаемого типа и параметров. Пример:
class MyClass {
public:
~MyClass() {
// Освобождение ресурсов
}
};
Деструктор вызывается в следующих случаях:
1. При выходе объекта из области видимости.
2. При явном вызове
delete
для объекта, созданного через new
.3. При завершении программы, если объект был создан в глобальной области видимости.
Деструкторы особенно важны для классов, управляющих ресурсами, чтобы избежать утечек памяти и других проблем.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
std::lock_guard
. Он позволяет захватывать и освобождать мьютекс вручную, поддерживает отложенную блокировку, а также может быть перемещён или передан в другие функции.#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void task() {
std::unique_lock<std::mutex> lock(mtx, std::defer_lock); // Отложенная блокировка
lock.lock(); // Захват мьютекса
std::cout << "Critical section\n";
lock.unlock(); // Освобождение мьютекса
}
std::unique_lock
полезен в сценариях, где требуется более тонкий контроль над блокировками, например, при использовании условных переменных.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
nullptr
— это ключевое слово, представляющее нулевой указатель. Оно было введено в C++11 для замены макроса NULL
и литерала 0
, которые использовались ранее.
int* ptr = nullptr;
nullptr
имеет тип std::nullptr_t
, что позволяет избежать неоднозначностей при перегрузке функций.
void func(int);
void func(int*);
func(nullptr); // Вызовется void func(int*)
Использование
nullptr
повышает безопасность и читаемость кода, так как явно указывает на нулевой указатель.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
std::async
и std::thread
заключается в уровне абстракции и управлении выполнением задач. std::thread
создает отдельный поток, который требует явного управления (например, вызов join()
или `detach()`). Поток начинает выполнение сразу после создания.
std::thread t([](){ /* код для выполнения */ });
t.join(); // Ожидание завершения потока
std::async
абстрагирует создание потока и возвращает std::future
, который может быть использован для получения результата асинхронной операции. По умолчанию, задача может быть выполнена в отдельном потоке или отложена, в зависимости от политики запуска.
auto future = std::async([](){ return 42; });
int result = future.get(); // Получение результата
std::async
удобен для задач с возвращаемым значением, а std::thread
— для полного контроля над потоками.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
sort
в STL (Standard Template Library) сортирует элементы в диапазоне, заданном итераторами. По умолчанию используется оператор <
, но можно передать пользовательский компаратор для определения порядка сортировки.
#include <algorithm>
#include <vector>
std::vector<int> vec = {4, 2, 5, 1, 3};
std::sort(vec.begin(), vec.end()); // Сортировка по возрастанию
Для сортировки по убыванию можно использовать
std::greater
:
std::sort(vec.begin(), vec.end(), std::greater<int>());
Функция
sort
работает за время O(N log N) и использует гибридный алгоритм (обычно Introsort), сочетающий QuickSort, HeapSort и InsertionSort. Это делает её эффективной для большинства случаев.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
class Base {
public:
virtual void show() {
// базовая реализация
}
};
class Derived : public Base {
public:
void show() override {
// переопределенная реализация
}
};
Base* obj = new Derived();
obj->show(); // вызовется метод Derived::show()
- Статический полиморфизм: выбор метода определяется на этапе компиляции.
- Динамический полиморфизм: выбор метода определяется во время выполнения на основе типа объекта.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
const
указывает, что значение переменной не может быть изменено после инициализации. Это помогает предотвратить случайные изменения данных и повышает читаемость кода.
const int maxValue = 100;
maxValue = 200; // Ошибка: попытка изменить константу
const
также может применяться к указателям, функциям и методам. Например, метод класса, объявленный как const
, гарантирует, что он не изменяет состояние объекта.
class MyClass {
public:
void myMethod() const {
// Этот метод не может изменять поля класса
}
};
Использование
const
улучшает безопасность кода и помогает компилятору оптимизировать выполнение программы.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
<type_traits>
, которая проверяет, являются ли два типа одинаковыми. Возвращает std::true_type
, если типы идентичны, и std::false_type
в противном случае.
#include <type_traits>
bool result1 = std::is_same<int, int>::value; // true
bool result2 = std::is_same<int, double>::value; // false
std::is_same
часто используется в шаблонном программировании для проверки типов на этапе компиляции. Это позволяет создавать специализированные реализации функций или классов в зависимости от типов.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
NULL
и nullptr
заключается в их типизации и использовании. - NULL
- Это макрос, который обычно определяется как
0
или ((void*)0)
. - Может вызывать неоднозначности при перегрузке функций, так как компилятор интерпретирует его как целое число (int).
- nullptr
- Это ключевое слово, введенное в стандарте C++11.
- Имеет тип
std::nullptr_t
, что позволяет избежать неоднозначностей при перегрузке функций и обеспечивает безопасность типов. Пример:
void func(int);
void func(char*);
func(NULL); // Вызовется func(int), что может быть неочевидно
func(nullptr); // Однозначно вызовется func(char*)
Использование
nullptr
предпочтительно в современном C++ для указания нулевого указателя.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM