C++ Academy
16.5K subscribers
617 photos
127 videos
1 file
579 links
По всем вопросам- @haarrp

@itchannels_telegram - 🔥 best it channels

РКН: clck.ru/3FmxJF
Download 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
👍205🔥5❤‍🔥2
🔥55😁424👍2🥰1🍌1
🖥 System2

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

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

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥211
🖥 Интересная задача по C++

Итак, нужно реализовать класс SmartArray (умный массив), который будет вести себя как обычный динамический массив, но при этом иметь следующие дополнительные возможности:
Автоматически увеличиваться в два раза при достижении текущего размера.
Автоматически уменьшаться в два раза, если количество элементов в массиве в 4 раза меньше, чем текущая емкость.
Поддерживать операции вставки, удаления и изменения элементов по индексу.

Придумал решение? Написал код? Тогда можешь смотреть

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

➡️ Делитесь с коллегами и 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
🔥841👍1🥰1
🖥 Полезная подборка антипаттернов C++

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

📎 Подборка

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
👍171🔥1😁1
🔥 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
👍136🔥4
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
👍172🔥21
🖥 Чем отличаются ссылки от указателей в С++

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

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

🔘Если вызывающая сторона не может не передать ссылку, то указатель может иметь специальное значение 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
👍133🔥21
🔥 Супер-годный контент по работе с корутинами в С++

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

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

📎 Статья

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1521🔥1🤮1
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
👍12🔥511
🖥 Имплементация 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
👍1221🔥1
🖥 Типичная задача с собеседования C++

Написать программу, которая печатает в консоли фразу Hello world, при условии, что функция main() данной программы выглядит следующим образом:
int main() 
{
return 0;
}


Ну как, есть решение? Написали? Тогда можно смотреть.

Ответ очень прост, вариантов несколько. Самый простой, основанный на свойстве глобальных статических объектов.
На изображении это у нас С стиль.
Если нужен С++ стиль: создаем класс, в конструкторе добавляем вывод, будет вывод до main, в деструкторе - после.


@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
👍235🔥2
🖥 Бьёрн Страуструп ответил на призыв Белого дома переходить с 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
👍328🔥21🐳1
🖥🖥 Использование 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
👍943🔥3
🖥 Предупреждение об арифметическое переполнение

▶️Итак, при запуске этого кода:
#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
👍133🔥21
🖥 Некоторые тонкости генерации случайных чисел в C++

C и C++ имеют свои собственные встроенные генераторы случайных чисел. Они реализованы в двух отдельных функциях, которые находятся в заголовочном файле cstdlib:

srand() устанавливает передаваемое пользователем значение в качестве стартового. srand() следует вызывать только один раз — в начале программы (обычно в верхней части функции main())

rand() генерирует следующее случайное число в последовательности. Оно будет находиться в диапазоне от 0 до RAND_MAX (константа в cstdlib, значением которой является 32767).

Вот пример программы, в которой используются обе эти функции:
#include <iostream>
#include <cstdlib> // для функций rand() и srand()

int main()
{
srand(4541); // устанавливаем стартовое значение - 4 541

// Выводим 100 случайных чисел
for (int count=0; count < 100; ++count)
{
std::cout << rand() << "\t";

// Если вывели 5 чисел, то вставляем символ новой строки
if ((count+1) % 5 == 0)
std::cout << "\n";
}
}

// 14867 24680 8872 25432 21865
// ...



Рандомные числа в C++ 11

В C++ 11 добавили тонну нового функционала для генерации случайных чисел, включая алгоритм Вихрь Мерсенна, а также разные виды генераторов случайных чисел (например, равномерные, генератор Poisson и пр.). Доступ к ним осуществляется через подключение заголовочного файла random.

Вот пример генерации случайных чисел в C++11 с использованием Вихря Мерсенна на картинке.

Вихрь Мерсенна генерирует случайные 32-битные целые числа unsigned (а не 15-битные целые числа, как в случае с rand()), что позволяет использовать гораздо больший диапазон значений.
Существует также версия (std::mt19937_64) для генерации 64-битных целых чисел unsigned

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1731🔥1💘1