C++ Academy
13.1K subscribers
265 photos
89 videos
283 links
По всем вопросам- @workakkk
Download Telegram
🖥 Крутые фичи C++, о которых ты мог не знать

☑️Псевдонимы типов
template <typename T>
using dyn_arr = std::vector<T>;
dyn_arr<int> nums; // эквивалентно std::vector<int>

using func_ptr = int (*)(int);

Семантически похоже на использование typedef, однако псевдонимы типов легче читаются и совместимы с шаблонами С++.

☑️Пользовательские литералы
using ull = unsigned long long;

constexpr ull operator"" _KB(ull no)
{
return no * 1024;
}

constexpr ull operator"" _MB(ull no)
{
return no * (1024_KB);
}

cout<<1_KB<<endl;
cout<<5_MB<<endl;

По большей части это будут какие-нибудь реальные единицы, такие как kb, mb, км, см, рубли, доллары, евро и т.д. Пользовательские литералы позволяют вам работать с ними как с другими примитивными типами.
Очень удобно для единиц и измерения.

☑️std::initializer_list
std::pair<int, int> p = {1, 2};
std::tuple<int, int> t = {1, 2};
std::vector<int> v = {1, 2, 3, 4, 5};
std::set<int> s = {1, 2, 3, 4, 5};
std::list<int> l = {1, 2, 3, 4, 5};
std::deque<int> d = {1, 2, 3, 4, 5};

std::array<int, 5> a = {1, 2, 3, 4, 5};

Присваивайте значения контейнерам непосредственно с помощью списка инициализаторов, это справедливо и для вложенных контейнеров.

☑️auto & decltype
auto a = 3.14; // double
auto b = 1; // int
auto& c = b; // int&
auto g = new auto(123); // int*
auto x; // error -- `x` requires initializer

auto-типизированные переменные выводятся компилятором на основе типа их инициализатора

☑️Циклы for по диапазону
std::array<int, 5> a {1, 2, 3, 4, 5};
for (int& x : a) x *= 2;
// a == { 2, 4, 6, 8, 10 }


☑️Делегирование конструкторов
struct demo
{
int m_var;
demo(int var) : m_var(var) {}
demo() : demo(0) {}
};

demo d;

Конструкторы теперь могут вызывать другие конструкторы из того же класса с помощью списка инициализаторов.

Вообще, фичей у плюсов много, используй их для повышения производительности
Вот статья в тему 21 фича современного C++, которые вам обязательно пригодятся «https://habr.com/ru/companies/otus/articles/741428/»

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Вероятно, лучшие лекции по плюсам в Рунете от Владимирова К. И.

В этом сборнике по C++ на 600 страниц разбирается абсолютно всё, в том числе:

Основы C++:
Введение в C++
Синтаксис и структура программы на C++
Переменные, типы данных и операторы
Управляющие конструкции (условные операторы, циклы)

Функции и ООП:
Функции и их использование
Основы объектно-ориентированного программирования (ООП)
Классы и объекты
Наследование и полиморфизм

Указатели, массивы и структуры данных:
Указатели и ссылки
Динамическое выделение памяти
Массивы и строки
Стандартные шаблонные библиотеки (STL)

Исключения, обработка ошибок и шаблоны:
Исключения и обработка ошибок
Шаблоны (templates) и их применение
Обобщенное программирование

Файлы и потоки:
Работа с файлами и потоками в C++
Сериализация и десериализация данных

Многопоточное программирование:
Основы многопоточного программирования
Синхронизация потоков
Параллельные вычисления

Продвинутые темы:
Метапрограммирование
Рефлексия
Работа с внешними библиотеками (API)

🔜 PDF

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 System2

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

https://github.com/Neko-Box-Coder/System2

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥Подборка лучших обучающих каналов для программистов.

➡️ Делитесь с коллегами и cохраняйте себе, чтобы не потерять

⚡️ Frontend
Javascript академия - крупнейший js канал
React - лучшие гайды и советы по работе с react
Frontend - тутрориалы, уроки, гайды, код
PHP
Книги frontend
Задачи frontend

🚀 Data Science

Анализ данных - полезные фишки, код, гайды и советы, маст-хэв датасаентиста
Data Jobs - ds вакансии
Аналитик данных
Data Science книги - актуальные бесплатные книги
Big data

#️⃣C#

С# академия
С# заметки — код, лучшие практики, заметки программиста c#
С# задачи и тесты
С# библиотека - актуальные бесплатные книги
C# вакансии - работа

Машинное обучение

Ml Собеседование - подготовка к собеседовению мл, алгоритмам, кодингу
Ml ru - актуальные статьи, новости, код и обучающие материалы
Ml Jobs - вакансии ML
ML Книги - актуальные бесплатные книги МО
ML чат
Machine Learning - полезные статьи новости гайды и разбор кода


🏆 Golang
Golang - подробные гайды, разбор кода, лучшие практики, заметки
Golang собеседование
Golang вакансии
Golang книги
Golang задачи и тесты
Golang чат
Golang news - новости go

🐍 Python

Python/django
Python Собеседование - подготовка к собеседовению python и разбор алгоритмов
Pro python - статьи, новости, код и обучающие материалы
Python Jobs - вакансии Python
Python чат
Python книги

Java

Java академия
Java вакансии
Java чат
Java вопросы с собеседований
Java книги

🛢Базы данных
Sql базы данных
Библиотека баз данных
SQL чат

💻 C++

C++ академия
С++ книги
C++ задачи - подготовка к собеседовению мл, алгоритмам
C++ вакансии

💥 Хакинг Kali Linux

Kali linux
linux_kal - kali чат
Информационная безопасность

🐧 Linux

Linux academy

🦀 Rust
Rust программирование
Rust чат
Rust книги для программистов

📲 Мобильная разработка
Android разработка
Мобильный разработчик гайды и уроки

🇬🇧 Английский для программистов

🧠 Искусственный интеллект
ИИ и технологии
Neural - нейросети для работы и жизни
Книги ИИ
Artificial Intelligence

🔥 DevOPs
Devops для программистов
Книги Devops

🌟 Docker/Kubernets
Docker
Kubernets

📓 Книги
Библиотеки Книг для программситов

💼 Папка с вакансиями:
Папка Go разработчика:
Папка Python разработчика:
Папка Data Science
Папка Java разработчика
Папка C#
Папка Frontend
🖥 Полезная подборка антипаттернов C++

60 антипаттернов и вредных советов для С++ программиста с подробными пояснениями.
В пояснениях можно найти интересную информацию.
В некоторых местах разбираются неочевидные нюансы C++; про них будет интересно почитать и опытным разработчикам.

📎 Подборка

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 50 годных сайтов с ресурсами по изучению C++ (и C)

🟡https://www.w3schools.com/cpp/ — Туториал по C++ от W3Schools
🟡https://cppreference.com/ — Справочник по C++
🟡https://www.onlinegdb.com/ — Мой любимый компилятор и дебаггер C++
🟡https://www.hotscripts.com/category/c-cpp/scripts-programs/ — Сотни программ и скриптов на C и C++, всё удобненько разложено по категоориям
🟡https://sourceforge.net/directory/ — Больше 75К проектов, написанных на C/C++
🟡https://www.daniweb.com/tags/c/code — Полезные фрагменты кода
🟡https://programmersheaven.com/categories/candcpp Ресурсы для прокачивания плюсов
🟡https://www.codecogs.com/ CodeCogs — это совместная библиотека с открытым исходным кодом, числовые компоненты которой написаны на C/C++.
🟡https://developers.google.com/code-search/ — Поиск кода с помощью Google
🟡https://www.cis.temple.edu/~ingargio/cis71/code/ — Список простых C-шных программ, с них можно начинать изучение
🟡https://www.codeproject.com/?cat=2 — Много полезностей по C/C++

Остальные ссылки не влезают в пост, поэтому продолжение тут

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
TCP/IP сети и `Boost.Asio` — объяснение от Ричарда Томсона

Boost.Asio — это кроссплатформенная библиотека C++ для программирования сетей и низкоуровневого ввода-вывода, которая предоставляет разработчикам последовательную асинхронную модель с использованием современного подхода C++.

В этом видео Ричард Томсон покажет, как работать с Boost.Asio и TCP/IP. Расскажет, как реализовать клиент NNTP (Network News Transport Protocol) с помощью Boost.Asio. NNTP — это линейно-ориентированный протокол для чтения новостных статей usenet. Это даст нам представление обо всех типичных проблемах, связанных с сетевыми приложениями TCP/IP:
🔘Как преобразовать имя хоста в IP-адрес?
🔘Как установить долговременное соединение с сервером NNTP?
🔘Как обрабатывать произвольно большие объемы данных с NNTP-сервера, которые поступают асинхронно?
🔘Как координировать ввод данных пользователем с вводом/выводом NNTP?
🔘Как справляться с неожиданными сетевыми ошибками?

Очень полезное видео, рекомендую
Youtube

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Чем отличаются ссылки от указателей в С++

В чем принципиальное отличие ссылки от указателя в С++? Какие ограничения есть у первых, а какие у вторых?

Вот некоторые из отличий::
🔘Нельзя объявить массив ссылок.
🔘У ссылки нет адреса.
🔘Существует арифметика указателей, но нет арифметики ссылок.
🔘Указатель может иметь «невалидное» значение с которым его можно сравнить перед использованием.

🔘Если вызывающая сторона не может не передать ссылку, то указатель может иметь специальное значение nullptr:
void f(int* num, int& num2)
{
if(num != nullptr) // if nullptr ignored algorithm
{
}
// can't check num2 on need to use or not
}


🔘Ссылка не обладает квалификатором const
#include <iostream>
int main()
{
std::cout << "Hello, world!\n";

const int v = 10;
//int& const r = v; // Ошибка
const int& r = v;

enum
{
is_const = std::is_const<decltype(r)>::value
};

if(!is_const)
std::cout << "const int& r is not const\n";
else
std::cout << "const int& r is const\n";
}


@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Супер-годный контент по работе с корутинами в С++

Напомню самую основную инфо по корутинам:
*️⃣Для объявления корутины используется ключевое слово co_return. Оно позволяет вернуть значение из корутины в вызывающий код.
*️⃣Для ожидания результата работы другой корутины используется ключевое слово co_await. Оно приостанавливает выполнение текущей корутины и передает управление вызывающему коду. Когда результат работы другой корутины готов, выполнение текущей корутины возобновляется.
*️⃣Для создания дескриптора корутины используется функция std::coroutine_handle. Она принимает указатель на функцию-корутину и возвращает объект класса std::coroutine_handle.

Ну а в этой статье ты найдёшь подробное описание разных нюансов и подводных камней, в процессе автор пишет асинхронный веб-клиент

📎 Статья

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 Свежая библиотека Intel x86-simd-sort 5.0

Относительно недавно состоялся релиз открытой библиотеки Intel x86-simd-sort 5.0, в которой представлен новый API для сортировки пользовательских объектов C++ с помощью object_qsort.

Согласно тестам разработчиков проекта, новая поддержка сортировки пользовательских объектов C++ может быть в 4-5 раз быстрее, чем использование std::sort в системах AVX-512, но в конечном итоге влияние на производительность будет варьироваться в зависимости от используемых задач.

Также в выпуске x86-simd-sort 5.0 добавлен новый API-интерфейс keyvalue_qsort для сортировки массивов, представляющих пары «ключ-значение», и этот новый API тоже работает намного быстрее.

В версии x86-simd-sort 5.0 добавлена поддержка AVX2 для методов argosrt и argselect. Эти дополнения AVX2 уже вошли в исходную версию NumPy для NumPy 2.0, причем эта библиотека Python была одним из первых проектов, который добавил поддержку высокопроизводительной библиотеки Intel.

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Имплементация print() на C++

🌟 Интересная статья о том, как реализовать Python-функцию print() на C++.
Автор создал C++ версию print() для отладки, назвал её cpp_dump(), и параллельно создал библиотеку cpp-dump для управления цветов и другими параметрами отображения объектов.

Функция cpp_dump() выводит разные объекты/переменные в строковом представлении, автоматически делает отступы для соответствия максимальной ширине строки.
cpp_dump() поддерживает различные другие типы, включая std::multimap и std::complex.

Можно настраивать цвета отображаемых при помощи cpp_dump() объектов.

📎 Статья

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Бьёрн Страуструп ответил на призыв Белого дома переходить с C++ на языки с безопасностью памяти

26 февраля 2024 года Белый дом США выпустил призыв переходить на языки программирования с безопасным доступом к памяти типа Rust. Бьёрн Страуструп, создатель языка C++, в комментарии для издания InfoWorld ответил на критику его творения.

Язык ассемблера и языки с низким уровнем абстракций по типу C и C++ поддерживают произвольную арифметику указателей с реальными адресами памяти без автоматической проверки границ, что допускает лёгкий «выстрел в ногу». Исторически сложилось, что на таких языках пишут низкоуровневые компоненты компьютерных систем: прошивки микроконтроллеров, операционные системы, критически важные и высоконагруженные приложения.

Аргументация Страструпа схожа с использованной ранее в ответе на призывы АНБ в 2022 году:
C++ — это не C. Бьёрн напомнил, что улучшение безопасности было задачей C++ с первого дня: «Просто попробуйте сравнить С эпохи Кернигана и Ритчи с самым ранним C++ и ранний C++ с современным C++».

C++ далеко продвинулся с 1979 года. «Эта эволюция кратко изложена в моём выступлении 2023 года на CppCon» — указал Страуструп. Он напомнил, что качественный код на С++ пишут с применением концепции RAII, контейнеров и умных указателей, а не «традиционной мешанины указателей C».

Понимание безопасности не всегда корректно. Как жалуется Страуструп, из миллиардов строчек кода на C++ лишь небольшая доля полностью следует современным рекомендациям безопасности, а сообщество по-разному оценивает, какие аспекты безопасности важны.

📎 Читать подробнее

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥🖥 Использование static в C++ и C#: методы, переменные, классы

Статический метод – это как универсальный инструмент, который работает без необходимости создавать объект класса.

Представим, что вы разрабатываете приложение для калькулятора. В нём есть разные математические операции, такие как сложение, вычитание, умножение и деление. Однако, есть одна операция, которая не требует данных о конкретном экземпляре калькулятора для выполнения — это, например, операция вычисления квадратного корня. Для таких операций идеально подходят статические методы.
public class Calculator {

// Статический метод для вычисления квадратного корня
public static double squareRoot(double number) {
return Math.sqrt(number);
}

// Обычный метод для сложения
public double add(double number1, double number2) {
return number1 + number2;
}
}


Для вызова статического метода не нужно создавать объект класса Calculator. Вы можете просто вызвать метод напрямую через имя класса:
double result = Calculator.squareRoot(16); // Возвращает 4.0


Основы и принципы работы static
Важно понимать, что статические переменные и методы хранятся в специальной области памяти (например, в .data или .bss для C++), и их значения или состояния сохраняются на протяжении всего времени работы программы. Это делает их идеальными для хранения глобальных настроек или выполнения операций, которые не зависят от состояния объектов.

Различия между static в C++ и C#
— Static в C++ часто используется для определения глобальных переменных, статических членов класса и функций, ограниченных областью видимости файла. Это позволяет избежать конфликтов имен и обеспечивает более чистую структуру кода.

— Static в C# имеет более широкое применение, включая статические классы, которые не могут быть инстанциированы и содержат только статические члены. Это делает C# статические классы идеальными для создания утилит и вспомогательных методов.

📎 Читать подробнее

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Предупреждение об арифметическое переполнение

▶️Итак, при запуске этого кода:
#include <iostream>
#include <vector>

int main() {
std::vector<int> a{0,1,2,3,4,5};
int b = 0;
std::cout << a[b + 1] << std::endl; // подчеркивает 'b+1'
return 0;
}

возникает проблема:
Арифметическое переполнение: использование оператора "+" на байтовом значении 4 и приведение результата к байтовому значению 8. Приведите значение к более широкому типу перед вызовом оператора "+", чтобы избежать переполнения (io.2)


Почему возникает такое предупреждение?


▶️В общем, в этом случае суть предупреждения такая: для индексации вектора на 64-битной платформе используется 64-битное беззнаковое целое, но выражение b+1 имеет тип int. Если предположить, что в b будет максимальное значение, представимое типом int, то получим UB.

Решение: привести хотя бы один из операндов к 64-битному типу.

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

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM