C++ Эволюция
2.72K subscribers
296 photos
2 videos
106 links
Обучающий канал по C++
Download Telegram
➡️ Использование std::as_const для безопасного получения константной ссылки

std::as_const — это функция, добавленная в C++17, которая возвращает константную ссылку на переданный объект. Это полезно, когда вы хотите вызвать только константные методы объекта или передать его в функции, не изменяя состояние объекта.

• std::as_const помогает явно указать, что объект не должен быть изменён, улучшая безопасность и читаемость кода.

🔗 Ссылочка на доку

C++ Learning 👩‍💻
➡️ Использование std::bit_cast для безопасного преобразования типов

std::bit_cast — это функция, введенная в C++20, которая позволяет безопасно преобразовывать один тип данных в другой, копируя биты напрямую. Эта функция полезна, когда нужно выполнить побитовую интерпретацию объекта как другого типа, например, для преобразования float в int.

• std::bit_cast безопаснее, чем reinterpret_cast, так как выполняет статическую проверку на соответствие типов. Она также может использоваться для сериализации данных или работы с битовыми представлениями различных структур.

C++ Learning 👩‍💻
Разбираем как решать задачи на LeetCode

Примеры решений
Пояснения

Выбери своё направление:

1. Python
2. JavaScript
3. Java
4. C#
5. Golang
6. C/C++
7. PHP
8. Kotlin
9. Swift
➡️ Использование библиотеки nameof для получения имени переменной или типа в виде строки

nameof — это современная и малоизвестная библиотека для C++, которая позволяет получать имя переменной, функции или типа в виде строки во время компиляции. Эта библиотека значительно упрощает отладку и логирование, так как позволяет автоматически генерировать строковые представления имён переменных и типов.

nameof может использоваться в случаях, когда вам нужно динамически получать имена переменных или типов без ручного указания строк.

🔗 Ссылочка на доку

C++ Learning 👩‍💻
➡️ Использование библиотеки Date для удобной работы с датами и временем

Библиотека Date — это мощная и гибкая библиотека, которая предоставляет расширенные возможности для работы с датами и временем в C++.

Она поддерживает работу с часовыми поясами, календарными датами, а также предоставляет удобный интерфейс для форматирования и парсинга дат. Эта библиотека разрабатывалась в рамках C++20 и доступна в виде отдельного репозитория.

Date отлично подходит для сложных задач, связанных с временными интервалами, разбором строковых представлений дат, и обработкой временных зон.

🔗 Ссылочка на доку

C++ Learning 👩‍💻
➡️ Использование std::popcount для подсчета количества установленных битов

std::popcount — это функция, добавленная в C++20, которая возвращает количество установленных битов (единиц) в бинарном представлении числа. Это особенно полезно при решении задач, связанных с битовой манипуляцией.

• std::popcount полезен при выполнении задач, связанных с битовой арифметикой, и позволяет просто определить количество установленных битов.

C++ Learning 👩‍💻
💸 Вакансии для IT'шников
Выбери своё направление

1. Frontend
2. Python
3. Java
4. Тестировщик QA
5. Data Science
6. DevOps
7. C#
8. C/C++
9. Golang
10. PHP
11. Kotlin
12. Swift
Что будет выведено при выполнении кода?

C++ Learning
👩‍💻
➡️ Использование библиотеки immer для работы с неизменяемыми структурами данных в C++

immer позволяет создавать и изменять структуры данных без изменения исходных объектов, что полезно в многопоточных и функциональных программах.

immer делает работу с данными безопаснее и эффективнее, особенно в многопоточной среде.

🔗 Ссылочка на доку

C++ Learning 👩‍💻
➡️ Использование библиотеки Magnum для создания кроссплатформенных графических приложений

Magnum — это современная библиотека C++ для разработки графических приложений. Она предоставляет мощный API для работы с OpenGL, OpenAL и другими мультимедийными ресурсами, позволяя создавать кроссплатформенные приложения, игры и интерактивные 3D-сцены.

Magnum идеально подходит для разработчиков, создающих графические движки или приложения с 3D-визуализацией.

🔗 Ссылочка на доку

C++ Learning 👩‍💻
➡️ Использование std::lcm и std::gcd для работы с наименьшим общим кратным и наибольшим общим делителем

std::lcm и std::gcd — это функции, добавленные в C++17, которые позволяют легко вычислить наименьшее общее кратное (НОК) и наибольший общий делитель (НОД) двух чисел. Они полезны при решении задач, связанных с арифметикой и оптимизацией.

Эти функции упрощают математические вычисления, делая код более чистым и надежным.

C++ Learning 👩‍💻
➡️ Использование std::ranges::views::filter и std::ranges::views::transform для обработки контейнеров

std::ranges::views::filter и std::ranges::views::transform — это инструменты, добавленные в C++20, позволяющие выполнять ленивую обработку контейнеров. Они позволяют фильтровать и изменять элементы контейнеров, не создавая новых копий.

Эти функции упрощают работу с контейнерами, делая код более выразительным и оптимизированным.

C++ Learning 👩‍💻
➡️ Использование std::unreachable для обозначения недостижимого кода

std::unreachable — это новая функция, добавленная в C++23, позволяющая указать компилятору, что определенный участок кода недостижим. Это может улучшить оптимизацию кода и сделать его более читаемым, помогая избежать предупреждений компилятора о возможных путях выполнения.

• std::unreachable полезен в ситуациях, когда вы уверены, что до определенного участка кода выполнение никогда не дойдет.

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

Что такое "RAII" (Resource Acquisition Is Initialization) и как это помогает в управлении ресурсами в C++?

Ответ ⬇️
"RAII" — это идиома, при которой инициализация объекта захватывает ресурс, а освобождение ресурса происходит автоматически при уничтожении объекта. Это гарантирует корректное освобождение ресурсов, таких как память или файловые дескрипторы, даже при исключениях.

🗣 Пример:
#include <iostream>

class File {
public:
File(const char* filename) {
file_ = fopen(filename, "w");
if (file_) {
std::cout << "Файл открыт.\n";
}
}

~File() {
if (file_) {
fclose(file_);
std::cout << "Файл закрыт.\n";
}
}

private:
FILE* file_;
};

int main() {
{
File file("example.txt");
// Работа с файлом
} // Файл автоматически закроется при выходе из блока

// Результат выполнения:
// Файл открыт.
// Файл закрыт.
}


C++ Learning 👩‍💻
➡️ Использование библиотеки Dragonbox для быстрого и точного преобразования чисел с плавающей точкой в строку

Dragonbox — это современная библиотека C++, которая обеспечивает чрезвычайно быстрое и точное преобразование чисел с плавающей точкой (float и double) в строковое представление. Она гарантирует корректность округления, что делает её отличным выбором для высокопроизводительных приложений.

Dragonbox полезен при разработке приложений, требующих работы с числовыми данными и их преобразования в строковый формат.

🔗 Ссылочка на доку

C++ Learning 👩‍💻
➡️ Использование std::expected для обработки ошибок без исключений

std::expected — это новый шаблонный класс, добавленный в C++23, который предоставляет способ возвращать либо ожидаемое значение, либо информацию об ошибке. Он позволяет более эффективно обрабатывать ошибки без использования исключений, делая код более чистым и понятным.

• std::expected полезен, когда нужно явно работать с ошибками, избегая накладных расходов и сложностей, связанных с исключениями.

C++ Learning 👩‍💻
➡️ Использование библиотеки NanoRange для работы с диапазонами в стиле C++20

NanoRange приносит функциональность диапазонов (Ranges) из C++20 в более ранние версии стандарта C++.

Она позволяет использовать удобные и гибкие инструменты для работы с последовательностями, такими как фильтрация, трансформация и ленивые вычисления, что делает код более чистым и выразительным.

NanoRange идеально подходит для проектов, работающих на стандартах C++11, C++14 или C++17, но желающих использовать преимущества std::ranges.

🔗 Ссылочка на доку

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

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

Как работает RVO (Return Value Optimization) в C++, и в каких случаях оно не применяется?

Ответ ⬇️
RVO — это оптимизация, при которой компилятор устраняет временные объекты, возвращаемые из функции, что значительно снижает накладные расходы на создание копий. Однако, есть ситуации, когда RVO не применяется, например, при возврате различных объектов в зависимости от условий внутри функции.

🗣 Пример:
#include <iostream>

struct MyObject {
MyObject() { std::cout << "Создан объект\n"; }
MyObject(const MyObject&) { std::cout << "Скопирован объект\n"; }
MyObject(MyObject&&) { std::cout << "Перемещён объект\n"; }
};

MyObject createObject(bool flag) {
if (flag) {
return MyObject(); // RVO применяется
} else {
MyObject obj;
return obj; // RVO может не применяться
}
}

int main() {
MyObject obj1 = createObject(true);
MyObject obj2 = createObject(false);
}


C++ Learning 👩‍💻
➡️ Использование std::barrier для синхронизации потоков

std::barrier — это новый примитив синхронизации, добавленный в C++20, который позволяет координировать выполнение группы потоков. Каждый поток выполняет свою работу до определенной точки (барьера) и ждет, пока все остальные потоки достигнут этой же точки, после чего выполнение продолжается.

• std::barrier полезен в параллельных вычислениях, где важно, чтобы все потоки завершили определенную задачу перед переходом к следующей.

C++ Learning 👩‍💻