Уютное сообщество С++ разработчиков
4.45K subscribers
94 photos
7 videos
96 links
Изучаем C++.
Ресурсы, обучения, задачи, шпаргалки.
Вопросы с собеседований по C++ и ответы на них.
Задачи и тесты по C++ для тренировки и обучения.
По рекламе: @anothertechrock
Download Telegram
Modern C++ for Absolute Beginners

Автор:
Slobodan Dmitrović
Год издания: 2023

#cpp #en #2O23

Скачать книгу
👍2
Обратный код

Обратный код или ones' complement - уже более совершенное представление целых чисел в двоичном виде. Этот код позволяет очень легко выполнять операции сложения/вычитания над числами, используя только лишь операцию сложения.

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

a - b = a + (-b)


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

Как и во всех системах, поддерживающих представление отрицательных чисел, в нем есть зарезервированный знаковый бит, а затем идет "модуль" числа. Например, число 5 в двоичном виде представляется, как 101. Восьмибиное знаковое число 5 в обратном коде представляется, как 00000101. Старший бит 0 значит, что число положительное, дальше идут незначащие нули и в конце наше число.

Инвертированное же число получается просто обращением всех битов в обратные. 0 в 1 и 1 в 0.

То есть число -5 представляется, как 11111010.

И если мы сложим 2 обратных числа, то получим естественно 0:

00000101 + 11111010 = 11111111 = 0


Причем складываются два числа без учета "особенности" старшего бита. Сложение происходит просто как сложение двух двоичных чисел. Если сумма не умещается в заданное количество бит, то новый старший разряд просто откидывается.
Давайте попробуем что-нибудь посчитать:

31 - 12 = 31 + (-12) = 00100000 + (-00001100) = 00100000 + 11110011 = 1'00010011(старший разряд откидываем, у нас всего 8 бит) = 00010011 = 19


Получили ожидаемое положительное(знаковый бит 0) число 19.

Можем уйти в минуса:

25 - 29 = 25 + (-29) = 00011001 + (-00011101) = 00011001 + 11100010 = 11111011 = -00000100 = -4


Вот так все просто.

Но и у этого кода есть недостатки. Главный из них вы уже могли заметить в посте. Ноль представляется, как 11111111. Точнее, у нуля 2 значения - все нули и все единички. То есть появляется +0 и -0.

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

Недостаток довольно надоедливый. Поэтому, и хоть динозавристые компьютеры использовали этот код, все современный машины используют дополнительный код. О нем в следующем посте.

Remove inconvenience from your life. Stay cool.

#base
👍2
👩‍💻 Cортировка элементов в контейнере с помощью библиотеки <algorithm>

<algorithm> — предоставляет набор стандартных алгоритмов для работы с контейнерами, такими как массивы, векторы и другие последовательности, включает множество полезных инструментов для обработки данных.

Основные алгоритмы:

• std::sort — сортирует элементы диапазона.

• std::find — ищет элемент в контейнере.

• std::reverse — переворачивает элементы диапазона.


🔥 — если узнал новое
🤝 если уже пользовался

📣 C++ Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Присвоение лямбды
#новичкам

Изучение лямбда выражений - не самая простая задача для начинающего плюсовика. Сложные термины, какие-то замыкания, списки захвата и прочее. В общем, непросто. И с виду можно подумать, что 2 одинаковые лямбды можно присваивать друг другу с легкостью. То есть может показаться, что такой код валидный:

int main() {
auto test = [](){};
test = [](){};

return 0;
}


Однако он генерирует примерно следующую ошибку:

In function ‘int main()’:
error: no match for ‘operator=’ in ‘test = <lambda closure object>main()::<lambda()>{}’
note: candidate is:
note: main()::<lambda()>& main()::<lambda()>::operator=(const main()::<lambda()>&) <deleted>
no known conversion for argument 1 from ‘main()::<lambda()>’ to ‘const main()::<lambda()>&’


Не нашел нужного оператора присваивания.

Да и вообще, это ж все лямбды, почему я не могу их присваивать друг другу?

Дело в том, что каждое отдельное лямбда-выражение генерирует свой тип, который называется замыканием. Только компилятор знает этот тип, вы его наружу никак не можете получить. Стандарт говорит:

The type of the lambda-expression [...] is a unique, unnamed non-union class type — called the closure type.


Это легко проверить. Такой код выведет 0:

auto test = [](){};
auto test2 = [](){};
std::cout << std::is_same_v<decltype( test ), decltype( test2 )> << std::endl;


Типы действительно разные.

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

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

Differentiate thing apart. Stay cool.

#cpp11
👍2
👩‍💻 Библиотека для работы с файловой системой

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

Основные возможности и общий функционал читай на картинках выше 👆


🔥 — если узнал новое
🤝 если уже пользовался

📣 C++ Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Основы С++ — хендбук от Яндекса по C++, в котором вы познакомитесь с основами языка, а так же более сложными темами и познакомитесь с основными библиотеками.

Ссылочка: https://education.yandex.ru/handbook/cpp

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Использование std::map для хранения ключ-значение

std::map — это контейнер, который хранит данные в виде пар ключ-значение, где ключи уникальны и автоматически сортируются.

Он автоматически сортирует элементы по ключам и обеспечивает быстрый поиск, вставку и удаление данных на основе ключей.

• insert() — вставляет новую пару ключ-значение

• find() — находит элемент по ключу

• erase() — удаляет элемент по ключу.

• size() — возвращает количество элементов в std::map


🔥 — если узнал новое
🤝 если уже пользовался

📣 C++ Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝2
И ведь приходится разворачиваться....
Programming: Principles and Practice Using C++

Автор:
Bjarne Stroustrup
Год издания: 2023

#en #cpp #2O23

Скачать книгу
👍1
Подробно рассказываем о высокопроизводительных решениях с фреймворком userver на новом бесплатном вебинаре!

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

 Вы узнаете:
- Уникальные архитектурные особенности и преимущества userver, которые сделают вашу работу легче и эффективнее.
- Как быстро настроить окружение и запустить свой первый проект, не тратя лишнего времени.
- Советы высококлассных профессионалов по работе с асинхронностью, которые помогут вам стать мастером своего дела и очень много другой полезной сочной информации!

💡 Будет особенно интересно:
- C++ разработчикам, стремящимся освоить мощный инструмент для создания микросервисов.
- Backend-инженерам и Team Lead'ам, ищущим высокопроизводительные решения для своих задач.
- Специалистам, работающим над масштабируемыми системами.

Получите практический и ценный опыт работы с userver, который можно сразу применить в своих проектах - регистрируйтесь по ссылке
P.S. Все зарегистрированные участники получат приличную скидку на обновленный топовый курс «C++ Developer. Professional»

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Статья дня. Параллельный метод сортировки массива std::thread

Принцип «разделяй и властвуй» является одной из фундаментальных стратегий в разработке параллельных алгоритмов. Он заключается в разбиении задачи на более мелкие подзадачи, решение которых происходит независимо, а затем объединении результатов этих подзадач для получения окончательного результата.

Читать статью

#читать
Подробно рассказываем о высокопроизводительных решениях с фреймворком userver на новом бесплатном вебинаре!

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

 Вы узнаете:
- Уникальные архитектурные особенности и преимущества userver, которые сделают вашу работу легче и эффективнее.
- Как быстро настроить окружение и запустить свой первый проект, не тратя лишнего времени.
- Советы высококлассных профессионалов по работе с асинхронностью, которые помогут вам стать мастером своего дела и очень много другой полезной сочной информации!

💡 Будет особенно интересно:
- C++ разработчикам, стремящимся освоить мощный инструмент для создания микросервисов.
- Backend-инженерам и Team Lead'ам, ищущим высокопроизводительные решения для своих задач.
- Специалистам, работающим над масштабируемыми системами.

Получите практический и ценный опыт работы с userver, который можно сразу применить в своих проектах - регистрируйтесь по ссылке

P.S. Все зарегистрированные участники получат приличную скидку на обновленный топовый курс «C++ Developer. Professional»

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
😄Нашел для вас полезную статью с Хабра, в которой вы узнаете, как создать программу компьютерного зрения на C++

В этой статье:
• Cоздадите проект в IDE Android Studio.
• Реализуете сессию непрерывного захвата изображений камеры.
• Преобразуете изображения в матрицу OpenCV.

🔊 Советую продолжить читать на Habr!


📣 C++ Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
Новый онлайн вебинар: Ускорение приложений за счёт индексирования баз данных!

1️⃣Мы создадим приложение, которое будет эффективно взаимодействовать с базой данных.
2️⃣Освоим создание индексов для реляционных баз данных, чтобы ваши запросы летали.
3️⃣Узнаем, как значительно ускорить выполнение запросов с помощью индексов.

❗️Кому будет полезно:
Начинающим разработчикам: Если вы хотите научиться работать с базами данных, как напрямую, так и с помощью ORM, а еще и узнать лайфхаки, то этот вебинар для вас!

Все зарегистрированные получают бонусную скидку на полноценный курс C# Developer, после которого вы освоите серверную разработку на C# до уровня Middle в Scrum-команде! А зарплаты спецов такого уровня уже от 160 000 рублей по данным hh ✌️

😏Записаться на урок, получить скидку и понять стоит ли оно того тут: https://vk.cc/cGd8l5

P.S. Это, кстати, классная возможность задать эксперту вопросы и получить сразу на них ответы!

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Уже сталкивались с обработкой файлов?
#новичкам

Сейчас начнем про это говорить. Обработка файлов позволяет читать и записывать данные, что является важной частью многих приложений.

Первым делом необходимо подключить <fstream>:
#include <fstream>
#include <iostream>
#include <string>


Чтобы прочитать данные из файла, используем std::ifstream. Например, открыть файл и вывести его содержимое на экран:
std::ifstream inputFile("example.txt");
std::string line;

while (std::getline(inputFile, line)) {
std::cout << line << std::endl;
}


Для записи данных в файл используем std::ofstream. Записать строку в файл:
std::ofstream outputFile("output.txt");
outputFile << "Hello, World!" << std::endl;


Также важно проверять, удалось ли открыть файл, чтобы избежать ошибок:
if (!inputFile) {
std::cerr << "Не удалось открыть файл!" << std::endl;
}


🔥 Так что всё это, позволяет сохранять и загружать данные, делая ваши приложения более функциональными

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
Работа с NoSQL на С#: разбираем нереляционные базы данных от первого бита и до последнего!

Всего за 90 минут мы:
1️⃣Подробно разберем, что такое NoSQL, их виды и почему это важно для современных разработчиков, рассмотрим уникальные особенности баз данных.
2️⃣Главное! Закрепим полученные знания на практике, работая с NoSQL базами.
3️⃣И даже если Вы уже работали с NoSQL, этот вебинар будет полезен для вас!

Ваши результаты после живого веба:
Понимание особенностей реляционных и нереляционных баз данных.
Уверенность в выборе оптимального типа базы данных для конкретных задач!

А продвинутый курс C# Developer. Professional поможет вам претендовать на зарплату Senior специалиста, которая, как правило, от 280 000 рублей/мес. Помимо знаний, опыта и ценных навыков, после выпускной работы Вы получите сертификат, который действительно ценится работодателями, потому что все наши курсы регулярно обновляются под текущие требования рынка: https://vk.cc/cGrgrM

До встречи на вебе!🧡

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
⁉️Микросервисы растут, а вы всё ещё передаёте данные через HTTP?

💻Открытый вебинар про RabbitMQ покажет, как поднять коммуникацию между микросервисами в ASP.NET Core на новый уровень. Настройки, код, MassTransit — разберём всё!

🔥Научитесь организовывать взаимодействие, которое выдержит любую нагрузку. Ваши микросервисы скажут «спасибо».

Ждём вас 30 января в 20:00 мск на открытом уроке перед стартом курса «C# ASP.NET Core разработчик». Участникам — скидка на обучение!

🔴Регистрируйтесь

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
This media is not supported in your browser
VIEW IN TELEGRAM
cppreference— обширная и подробная документация по стандартной библиотеке C++, включая примеры и пояснения.

📌 Ссылочка: cppreference.com

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM