Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2
Массив — это статический контейнер с фиксированным размером, который задаётся при создании. Размер массива не может изменяться в процессе выполнения программы.
int arr[5] = {1, 2, 3, 4, 5}; // Статический массив из 5 элементов
Вектор — это динамический массив, который может изменять свой размер в процессе выполнения. Вектор автоматически управляет памятью, увеличивая или уменьшая её при добавлении или удалении элементов.
#include <vector>
std::vector<int> vec; // Инициализация вектора
vec.push_back(1); // Добавление элемента
vec.push_back(2); // Вектор автоматически увеличивает размер
Векторы предлагают больше функционала, таких как автоматическое управление памятью и встроенные методы для работы с элементами, в то время как массивы обеспечивают более низкий уровень доступа к памяти и подходят для случаев, когда размер известен заранее.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3✍2🔥1
пы
int и fl
oat используются для хранения числовых данных, но имеют ключевые различия.- int: Целочисленный тип, который хранит целые числа без дробной части. Занимает фиксированный объем памяти (обычно 4 байта) и имеет ограниченный диапазон значений (например, от -2³¹ до 2³¹-1).
- float: Тип с плавающей точкой, который хранит числа с дробной частью. Использует 4 байта памяти и представляет числа в формате IEEE 754. Позволяет работать с дробными значениями, но имеет ограниченную точность из-за особенностей представления.
int a = 5; // Целое число
float b = 5.5f; // Число с плавающей точкой
Основное различие:
int
подходит для точных целочисленных операций, а float
— для вычислений с дробными числами, но с возможной потерей точности.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1🤔1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
std::thread::hardware_concurrency — это статическая функция, которая возвращает количество потоков, которые могут быть выполнены одновременно на текущем оборудовании. Это значение обычно соответствует количеству логических процессоров (ядер) в системе.
Функция полезна для оптимизации многопоточных программ, так как позволяет определить оптимальное количество потоков для выполнения задач. Если функция не может определить количество ядер, она возвращает 0.
Использование
Ставь👍 , если было полезно!
Больше ответов на сайте👈
✈️ С++ собеседования
Функция полезна для оптимизации многопоточных программ, так как позволяет определить оптимальное количество потоков для выполнения задач. Если функция не может определить количество ядер, она возвращает 0.
#include <iostream>
#include <thread>
int main() {
unsigned int numThreads = std::thread::hardware_concurrency();
std::cout << "Number of concurrent threads supported: " << numThreads << std::endl;
return 0;
}
Использование
hardware_concurrency
помогает избежать создания избыточного количества потоков, что может привести к снижению производительности из-за накладных расходов на переключение контекста.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2👀2
std::array
— это контейнер из стандартной библиотеки, представляющий статический массив фиксированного размера. В отличие от обычных массивов, std::array
предоставляет дополнительные методы, такие как size()
, begin()
, end()
, и поддерживает итераторы, что делает его более удобным и безопасным в использовании.Пример:
#include <array>
#include <iostream>
int main() {
std::array<int, 3> arr = {1, 2, 3}; // Создание массива из 3 элементов
std::cout << "Size: " << arr.size() << std::endl; // Размер массива
}
std::array
хранит данные на стеке, что обеспечивает высокую производительность, и гарантирует отсутствие утечек памяти.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
scoped_lock
происходит захват всех переданных мьютексов, а при выходе из области видимости — их автоматическое освобождение.
std::mutex mtx1, mtx2;
{
std::scoped_lock lock(mtx1, mtx2); // Захватывает оба мьютекса
// Критическая секция
} // Мьютексы автоматически освобождаются
Использование
scoped_lock
особенно полезно в ситуациях, где требуется захватить несколько мьютексов одновременно, обеспечивая безопасность и удобство.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
int x = 10;
decltype(x) y = 20; // Тип y будет int, так как тип x — int
decltype
также учитывает категорию значения (lvalue, rvalue), что делает его полезным для точного определения типов в сложных сценариях. Например, при работе с возвращаемыми значениями функций или выражениями.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
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
👍5❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
Деструктор имеет имя, совпадающее с именем класса, но с тильдой (~) в начале. У него нет возвращаемого типа и параметров. Пример:
class MyClass {
public:
~MyClass() {
// Освобождение ресурсов
}
};
Деструктор вызывается в следующих случаях:
1. При выходе объекта из области видимости.
2. При явном вызове
delete
для объекта, созданного через new
.3. При завершении программы, если объект был создан в глобальной области видимости.
Деструкторы особенно важны для классов, управляющих ресурсами, чтобы избежать утечек памяти и других проблем.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
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
👍6❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍5
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
👍5❤1👀1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
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
👍8❤1