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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2
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
👍6❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1
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
👍4❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3🤔1
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
👍9
<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
👍7❤1
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
👍4
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Основные компоненты STL:
- Контейнеры: vector, list, map, set и другие структуры для хранения данных.
- Алгоритмы: sort, find, copy и другие операции над данными.
- Итераторы: обеспечивают доступ к элементам контейнеров.
Пример:
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {5, 3, 1, 4, 2};
std::sort(vec.begin(), vec.end()); // Сортировка вектора
return 0;
}
STL позволяет писать эффективный и читаемый код, минимизируя ручное управление памятью и дублирование кода.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
std::packaged_task
— это шаблонный класс, который оборачивает вызываемый объект (функцию, лямбду или функтор) и позволяет асинхронно получить результат его выполнения через std::future
. Используется для выполнения задач в отдельном потоке с последующим получением результата.Пример:
#include <future>
#include <iostream>
int main() {
std::packaged_task<int()> task([](){ return 42; });
std::future<int> result = task.get_future();
std::thread t(std::move(task)); // Запуск задачи в отдельном потоке
t.join();
std::cout << result.get(); // Получение результата: 42
return 0;
}
std::packaged_task
полезен для управления асинхронными операциями и синхронизации результатов между потоками.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
class Base {
public:
void display() {
cout << "Base class" << endl;
}
};
class Derived : public Base {
public:
void display() {
cout << "Derived class" << endl; // Переопределение метода
}
};
Производный класс может обращаться к методам и полям базового класса, если они не являются приватными.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
for
в C++ состоит из трех частей: инициализации, условия и инкремента/декремента. Он выполняется до тех пор, пока условие истинно.
for (int i = 0; i < 10; i++) {
// Тело цикла
}
1. Инициализация:
int i = 0
— выполняется один раз перед началом цикла.2. Условие:
i < 10
— проверяется перед каждой итерацией. Если условие ложно, цикл завершается.3. Инкремент:
i++
— выполняется после каждой итерации.Цикл
for
также поддерживает range-based итерацию для работы с коллекциями:
for (int value : array) {
// Тело цикла
}
Этот вариант автоматически перебирает элементы контейнера, упрощая работу с массивами и другими структурами данных.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12