➡️ Магия счётчиков
Думаю каждый встречался с циклами. Так вот. Там есть интересная особенность — нужно объявлять счетчик. Это дико бесит начинающих программистов, так что предлагаю такую конструкцию:
int i = 0;
for(i=0; i < n; i++) { //учимся считать }
• Заменять на такую:
for(int i = 0; i < n; i++) { //учимся считать }
• Это удобнее и красивее
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
Думаю каждый встречался с циклами. Так вот. Там есть интересная особенность — нужно объявлять счетчик. Это дико бесит начинающих программистов, так что предлагаю такую конструкцию:
int i = 0;
for(i=0; i < n; i++) { //учимся считать }
• Заменять на такую:
for(int i = 0; i < n; i++) { //учимся считать }
• Это удобнее и красивее
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
4 типовые ловушки в работе со строками в С и С++ и как их избежать
Смотреть статью ()
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
https://habr.com/ru/companies/ncloudtech/articles/830918/
Смотреть статью ()
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
https://habr.com/ru/companies/ncloudtech/articles/830918/
Какой результат даст выражение CharTable {}.is_printable(0x81) на x86?
Зависит от платформы и знаковости char! На ARM этот код работает корректно. Там
На x86 в коде будет неопределённое поведение. Знаковый char 0x81 (-127) при передаче в std::array<T, N>::operator[](size_t) становится большим беззнаковым числом, которое больше размера массива. Мы получаем выход за границу массива и все вытекающие из этого проблемы. С очень большой вероятностью вызов упадёт с ошибкой сегментации.
https://godbolt.org/z/Wzzbdj1d9
Задачка из квиза по неопределённому поведению Дмитрия Свиридкина, опубликована на сайте PVS-Studio.
struct CharTable {
static_assert(CHAR_BIT == 8);
std::array<bool, 256> _is_printable {};
CharTable() {
_is_printable.fill(true);
_is_printable[0x81] = false;
}
bool is_printable(char c) const {
return this->_is_printable[c];
}
};
Зависит от платформы и знаковости char! На ARM этот код работает корректно. Там
char
беззнаковый.На x86 в коде будет неопределённое поведение. Знаковый char 0x81 (-127) при передаче в std::array<T, N>::operator[](size_t) становится большим беззнаковым числом, которое больше размера массива. Мы получаем выход за границу массива и все вытекающие из этого проблемы. С очень большой вероятностью вызов упадёт с ошибкой сегментации.
https://godbolt.org/z/Wzzbdj1d9
Задачка из квиза по неопределённому поведению Дмитрия Свиридкина, опубликована на сайте PVS-Studio.
godbolt.org
Compiler Explorer - C++
struct CharTable
{
static_assert(CHAR_BIT == 8);
std::array<bool, 256> _is_printable {};
CharTable()
{
_is_printable.fill(true);
_is_printable[0x81] = false;
}
bool is_printable(char c) const
{
return this->_is_printable[c];…
{
static_assert(CHAR_BIT == 8);
std::array<bool, 256> _is_printable {};
CharTable()
{
_is_printable.fill(true);
_is_printable[0x81] = false;
}
bool is_printable(char c) const
{
return this->_is_printable[c];…
➡️ Магия byte
Не многие знаю что существует тип переменной byte. Число этого типа может быть в диапазоне от 0 до 255.
👀 А теперь посмотрите насколько это удобно использовать для хранения значений аналоговых входов Просто идеально… Главное в минус не загоняйте число)
🗣 А, и занимает это чудо в 2 раза меньше памяти. За такое вас по головке поглядят.
👩💻
@quizcpp
Не многие знаю что существует тип переменной byte. Число этого типа может быть в диапазоне от 0 до 255.
👀 А теперь посмотрите насколько это удобно использовать для хранения значений аналоговых входов Просто идеально… Главное в минус не загоняйте число)
🗣 А, и занимает это чудо в 2 раза меньше памяти. За такое вас по головке поглядят.
👩💻
@quizcpp
➡️ Вложенные макросы
Используйте вложенные макросы везде. Это хороший способ сократить код.
• Макрос LOG: Выводит сообщение в консоль.
• Макрос ADD: Складывает два числа.
• Макрос ADD_AND_LOG: Сложение двух чисел и вывод результата в консоль с использованием вложенных макросов.
👩💻
@quizcpp
Используйте вложенные макросы везде. Это хороший способ сократить код.
• Макрос LOG: Выводит сообщение в консоль.
• Макрос ADD: Складывает два числа.
• Макрос ADD_AND_LOG: Сложение двух чисел и вывод результата в консоль с использованием вложенных макросов.
👩💻
@quizcpp
➡️ Использование алиасов для длинных типов
Это позволяет значительно упростить код, сделать его более читаемым и легким для поддержки.
• Например:
typedef std::vector StrVector;
👩💻
@quizcpp
Это позволяет значительно упростить код, сделать его более читаемым и легким для поддержки.
• Например:
typedef std::vector StrVector;
👩💻
@quizcpp
➡️ Использование RAII для Управления Ресурсами в C++
RAII (Resource Acquisition Is Initialization) — это идиома в C++, которая обеспечивает автоматическое управление ресурсами. Она гарантирует, что ресурсы будут освобождены, когда объект, владеющий ими, выходит из области видимости.
Класс FileWrapper:
• Конструктор открывает файл и выбрасывает исключение, если файл не может быть открыт.
• Деструктор гарантирует, что файл будет закрыт при выходе объекта из области видимости, даже если произошло исключение.
Метод write:
• Проверяет, открыт ли файл, и записывает сообщение в файл, если файл открыт.
Использование в main:
• Объект FileWrapper создается в блоке try, и файл автоматически закрывается, когда объект выходит из области видимости.
• Исключения обрабатываются в блоке catch, выводя сообщение об ошибке.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
RAII (Resource Acquisition Is Initialization) — это идиома в C++, которая обеспечивает автоматическое управление ресурсами. Она гарантирует, что ресурсы будут освобождены, когда объект, владеющий ими, выходит из области видимости.
Класс FileWrapper:
• Конструктор открывает файл и выбрасывает исключение, если файл не может быть открыт.
• Деструктор гарантирует, что файл будет закрыт при выходе объекта из области видимости, даже если произошло исключение.
Метод write:
• Проверяет, открыт ли файл, и записывает сообщение в файл, если файл открыт.
Использование в main:
• Объект FileWrapper создается в блоке try, и файл автоматически закрывается, когда объект выходит из области видимости.
• Исключения обрабатываются в блоке catch, выводя сообщение об ошибке.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
audioFlux
audioFlux — это библиотека C++ с открытым исходным кодом для работы со звуком. Она предоставляет простой и удобный интерфейс для выполнения различных задач, связанных с обработкой аудио.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
audioFlux — это библиотека C++ с открытым исходным кодом для работы со звуком. Она предоставляет простой и удобный интерфейс для выполнения различных задач, связанных с обработкой аудио.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
➡️ Обнаружение утечек памяти с использованием нестандартного оператора new в C++
В C++ утечки памяти могут стать серьезной проблемой, особенно в больших проектах. Один из способов обнаружения утечек памяти — переопределение оператора new, чтобы отслеживать выделение и освобождение памяти.
• Мы переопределяем оператор new, чтобы отслеживать все выделения памяти, сохраняя указатели и размеры выделенных блоков в std::map.
• Переопределение оператора delete позволяет отслеживать освобождение памяти. Когда память освобождается, соответствующая запись удаляется из allocations.
• В конце программы проверяется, остались ли неосвобожденные участки памяти, что позволяет обнаружить утечки.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
В C++ утечки памяти могут стать серьезной проблемой, особенно в больших проектах. Один из способов обнаружения утечек памяти — переопределение оператора new, чтобы отслеживать выделение и освобождение памяти.
• Мы переопределяем оператор new, чтобы отслеживать все выделения памяти, сохраняя указатели и размеры выделенных блоков в std::map.
• Переопределение оператора delete позволяет отслеживать освобождение памяти. Когда память освобождается, соответствующая запись удаляется из allocations.
• В конце программы проверяется, остались ли неосвобожденные участки памяти, что позволяет обнаружить утечки.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
➡️ Ленивая инициализация статического объекта с использованием std::call_once
В многопоточных приложениях иногда требуется лениво инициализировать ресурсы, гарантируя, что это произойдет только один раз, даже если несколько потоков пытаются сделать это одновременно.
🗣️ Для этого можно использовать std::call_once.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
В многопоточных приложениях иногда требуется лениво инициализировать ресурсы, гарантируя, что это произойдет только один раз, даже если несколько потоков пытаются сделать это одновременно.
🗣️ Для этого можно использовать std::call_once.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
➡️ Оптимизация использования памяти с помощью std::string_view
std::string_view — это новый тип в C++17, который позволяет работать со строками без их копирования.
• Это особенно полезно при работе с большими строками или при передаче строковых данных между функциями, когда не требуется владение строкой.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
std::string_view — это новый тип в C++17, который позволяет работать со строками без их копирования.
• Это особенно полезно при работе с большими строками или при передаче строковых данных между функциями, когда не требуется владение строкой.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
➡️ Локальные анонимные функции с использованием std::function и std::bind
В C++ можно использовать анонимные функции (лямбда-функции) не только для однократных вызовов, но и для создания сложных цепочек вызовов или отложенного выполнения.
• С помощью std::function и std::bind можно создавать гибкие и мощные конструкции.
• std::bind позволяет создавать новые функции с фиксированными значениями для некоторых аргументов. В примере выше создается функция addFive, которая всегда добавляет 5 к переданному ей значению.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
В C++ можно использовать анонимные функции (лямбда-функции) не только для однократных вызовов, но и для создания сложных цепочек вызовов или отложенного выполнения.
• С помощью std::function и std::bind можно создавать гибкие и мощные конструкции.
• std::bind позволяет создавать новые функции с фиксированными значениями для некоторых аргументов. В примере выше создается функция addFive, которая всегда добавляет 5 к переданному ей значению.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
В преддверии новой активности мы собрали в одну папку 18 Telegram-каналов известных профессионалов и попросили их авторов подготовить для вас документы, которые помогут:
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ Библиотека TOML11
TOML11 — это библиотека для парсинга и сериализации конфигурационных файлов в формате TOML (Tom's Obvious, Minimal Language) на C++. Она поддерживает полное соответствие спецификации TOML и позволяет легко работать с конфигурационными файлами, делая их удобными для человека и машины.
• Если вы ищете простой и эффективный способ работы с конфигурациями в формате TOML в C++, TOML11 — отличный выбор.
🔗 Ссылочка на доку (https://github.com/ToruNiina/toml11)
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
TOML11 — это библиотека для парсинга и сериализации конфигурационных файлов в формате TOML (Tom's Obvious, Minimal Language) на C++. Она поддерживает полное соответствие спецификации TOML и позволяет легко работать с конфигурационными файлами, делая их удобными для человека и машины.
• Если вы ищете простой и эффективный способ работы с конфигурациями в формате TOML в C++, TOML11 — отличный выбор.
🔗 Ссылочка на доку (https://github.com/ToruNiina/toml11)
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
➡️ Разделители разрядов чисел
• Раньше вам нужно было считать цифры или нули, но, начиная с C++14, вы можете сделать большие числа намного нагляднее.
• Эта фича помогает облегчить навигацию по словам и цифрам. Или, допустим, вы можете повысить читаемость номера кредитной карты или социального страхования.
• Благодаря сгруппированным разрядам, ваш код станет немного выразительнее.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
• Раньше вам нужно было считать цифры или нули, но, начиная с C++14, вы можете сделать большие числа намного нагляднее.
• Эта фича помогает облегчить навигацию по словам и цифрам. Или, допустим, вы можете повысить читаемость номера кредитной карты или социального страхования.
• Благодаря сгруппированным разрядам, ваш код станет немного выразительнее.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
Привет, на связи админ.
Многие из вас слышали про VEO3 нейронку, которая очень качественно генерит видосы. Я ее встроил в бота, () можете затестить(самые низкие цены на рынке, ниже не найдете нигде veo3 ()
@quizcpp
https://www.tgoop.com/Veo3_official_bot?start=myit
Многие из вас слышали про VEO3 нейронку, которая очень качественно генерит видосы. Я ее встроил в бота, () можете затестить(самые низкие цены на рынке, ниже не найдете нигде veo3 ()
@quizcpp
https://www.tgoop.com/Veo3_official_bot?start=myit
Telegram
Veo3
По всем вопросам @mascarov_valentin
LibSourcey
LibSourcey — это набор кроссплатформенных модулей и классов C++14, предоставляющий разработчикам инструменты для быстрого создания высокопроизводительных сетевых приложений на основе p2p и потокового мультимедиа.
Библиотека позиционирует себя как высокопроизводительное решение, объединяющее в себе функциональность libuv, FFmpeg, OpenCV и WebRTC.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
LibSourcey — это набор кроссплатформенных модулей и классов C++14, предоставляющий разработчикам инструменты для быстрого создания высокопроизводительных сетевых приложений на основе p2p и потокового мультимедиа.
Библиотека позиционирует себя как высокопроизводительное решение, объединяющее в себе функциональность libuv, FFmpeg, OpenCV и WebRTC.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
➡️ Библиотека Cereal — сериализация данных в C++
Cereal — это библиотека для сериализации данных в C++, которая поддерживает как текстовые, так и бинарные форматы. Она проста в использовании, но при этом гибка, предоставляя возможность легко сохранять и загружать сложные объекты и структуры данных.
• Cereal — идеальный выбор для разработчиков, которым нужно сериализовать данные для сохранения в файлы или передачи по сети.
🔗 Ссылочка на доку (https://uscilab.github.io/cereal/)
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
Cereal — это библиотека для сериализации данных в C++, которая поддерживает как текстовые, так и бинарные форматы. Она проста в использовании, но при этом гибка, предоставляя возможность легко сохранять и загружать сложные объекты и структуры данных.
• Cereal — идеальный выбор для разработчиков, которым нужно сериализовать данные для сохранения в файлы или передачи по сети.
🔗 Ссылочка на доку (https://uscilab.github.io/cereal/)
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
➡️ Библиотека SOCI — удобная работа с базами данных в C++
SOCI (The C++ Database Access Library) — это библиотека, которая упрощает взаимодействие с различными базами данных, такими как PostgreSQL, MySQL, SQLite, и Oracle. Она предоставляет интерфейс, похожий на SQL, и позволяет работать с базами данных, используя простые и понятные C++-конструкции.
• SOCI — отличный выбор для разработчиков, которым нужно легко интегрировать базы данных в C++ проекты, не жертвуя производительностью и удобством.
🔗 Ссылочка на доку (https://github.com/SOCI/soci)
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
SOCI (The C++ Database Access Library) — это библиотека, которая упрощает взаимодействие с различными базами данных, такими как PostgreSQL, MySQL, SQLite, и Oracle. Она предоставляет интерфейс, похожий на SQL, и позволяет работать с базами данных, используя простые и понятные C++-конструкции.
• SOCI — отличный выбор для разработчиков, которым нужно легко интегрировать базы данных в C++ проекты, не жертвуя производительностью и удобством.
🔗 Ссылочка на доку (https://github.com/SOCI/soci)
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp