Библиотека C/C++ разработчика | cpp, boost, qt
20.6K subscribers
1.69K photos
45 videos
16 files
3.87K links
Все самое полезное для плюсовика и сишника в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/d6cd2932

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
加入频道
💡 Исключения в C++ — элегантная обработка ошибок

Правильная обработка ошибок отличает профессиональный код от любительского. Исключения в C++ позволяют писать надежные программы без засорения кода проверками возвращаемых значений.

Изучи исключения C++
Документация

Библиотека C/C++ разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
📝 Немного инсайтов из третьего модуля курса

Сейчас большинство представлений об ИИ ограничиваются одним агентом — моделькой, которая что-то предсказывает, генерирует или классифицирует.

Но реальный прорыв начинается, когда этих агентов становится несколько.
Когда они начинают взаимодействовать друг с другом.
Когда появляется координация, распределение ролей, память, планирование — всё это и есть мультиагентные системы (MAS).

➡️ Пока кто-то думает, что это звучит как научная фантастика, индустрия уже переходит к новым уровням сложности:
— Microsoft делает язык DroidSpeak для общения между LLM
— Open Source-фреймворки вроде LangChain, AutoGen, CrewAI, LangGraph — бурно развиваются
— компании, включая МТС, уже применяют MAS в боевых задачах

🎓 На курсе мы подходим к этому практично:
🔵 разбираем, как устроены MAS
🔵 пишем агентов с нуля
🔵 учимся выстраивать взаимодействие: конкуренцию, кооперацию, планирование

Именно на третьем уроке вы впервые собираете не просто «умного бота», а живую систему из агентов, которая работает вместе — как команда.

Причём по-настоящему: врач, SQL-аналитик, travel-планировщик, Python-генератор, поисковик.

🙂 Если хочется не просто использовать ИИ, а проектировать системы, которые думают, планируют и сотрудничают тогда забирайте курс по ИИ-агентам
Please open Telegram to view this post
VIEW IN TELEGRAM
✏️ Промпт дня: Поиск и исправление ошибок в C++

Иногда мы не замечаем уязвимости и потенциальные проблемы в нашем коде. AI-помощник может сэкономить не только время, но и избавить от серьезных багов в продакшене.

🍴 Промпт для AI-помощника:

Review this code for errors and refactor to fix any issues:

[Вставь свой код]


‼️ Пример использования промпта:

Было:
class DataProcessor {
public:
char* processData(char* input) {
char* buffer = new char[100];
strcpy(buffer, input);
return buffer;
}

void cleanup() {
// забыли освободить память
}
};

void example() {
DataProcessor dp;
char* result = dp.processData("some long input data that might overflow");
// утечка памяти - не вызываем delete
}


Стало (после AI-ревью):

class DataProcessor {
public:
std::string ProcessData(const std::string& input) {
// Используем std::string для безопасности
return input; // или любая другая обработка
}

// Деструктор не нужен - RAII работает автоматически
};

void Example() {
DataProcessor dp;
std::string result = dp.ProcessData("some long input data that might overflow");
// Автоматическое управление памятью
}



Что исправил AI:

Убрал потенциальный buffer overflow
Заменил ручное управление памятью на RAII
Использовал безопасные std::string вместо char*
Исправил стиль именования функций
Устранил утечки памяти

⛄️ А используете ли вы AI для ревью кода? Поделитесь опытом в комментариях!

Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔄 std::source_location: автоматическое логирование

Забудьте FILE и LINE! std::source_location автоматически получает информацию о местоположении в коде.


#include <iostream>
#include <source_location>
#include <string_view>

void log_error(std::string_view message,
const std::source_location& loc = std::source_location::current()) {
std::cout << "ОШИБКА в " << loc.file_name()
<< ":" << loc.line()
<< " в функции " << loc.function_name()
<< " - " << message << std::endl;
}

void problematic_function() {
log_error("Что-то пошло не так!"); // Автоматически получит location
}

int main() {
log_error("Ошибка инициализации");
problematic_function();
return 0;
}


Важно: source_location вычисляется в точке вызова, не в точке определения функции.

Библиотека C/C++ разработчика #буст
How to: Создание собственного итератора для контейнера

Периодически требуется реализовать интеграцию с STL алгоритмами. Для этого необходимо реализовать правильные API.

Проблема: Нужно создать контейнер, работающий с range-based for и STL.


✏️ Решение:

1️⃣ Реализуйте iterator traits
2️⃣ Определите begin() и end()
3️⃣ Поддержите const итераторы

#include <iterator>
#include <algorithm>
#include <iostream>

template<typename T>
class CircularBuffer {
T* data;
size_t capacity_;
size_t size_;
size_t head_ = 0;

public:
explicit CircularBuffer(size_t capacity)
: data(new T[capacity]), capacity_(capacity), size_(0) {}

~CircularBuffer() { delete[] data; }

// Iterator class
class iterator {
T* ptr;
size_t capacity;
size_t index;

public:
using iterator_category = std::forward_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = T*;
using reference = T&;

iterator(T* ptr, size_t capacity, size_t index)
: ptr(ptr), capacity(capacity), index(index) {}

reference operator*() { return ptr[index % capacity]; }
pointer operator->() { return &ptr[index % capacity]; }

iterator& operator++() {
++index;
return *this;
}

iterator operator++(int) {
iterator tmp = *this;
++index;
return tmp;
}

bool operator==(const iterator& other) const {
return index == other.index;
}

bool operator!=(const iterator& other) const {
return !(*this == other);
}
};

void push(const T& item) {
data[(head_ + size_) % capacity_] = item;
if (size_ < capacity_) {
++size_;
} else {
++head_;
head_ %= capacity_;
}
}

iterator begin() { return iterator(data, capacity_, head_); }
iterator end() { return iterator(data, capacity_, head_ + size_); }

size_t size() const { return size_; }
bool empty() const { return size_ == 0; }
};

int main() {
CircularBuffer<int> buffer(5);

// Заполняем буфер
for (int i = 1; i <= 7; ++i) {
buffer.push(i);
}

// Range-based for работает!
for (const auto& item : buffer) {
std::cout << item << " ";
}
std::cout << std::endl;

// STL алгоритмы работают!
auto it = std::find(buffer.begin(), buffer.end(), 5);
if (it != buffer.end()) {
std::cout << "Found: " << *it << std::endl;
}
}


Частые ошибки: Не реализовать все необходимые operator для итератора.

💡 Совет: Правильные итераторы делают ваш контейнер first-class citizen в ST.

Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM