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

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

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

Наши каналы: https://yangx.top/proglibrary/9197

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
加入频道
🌳 Как объявить интерфейс в C ++?

В C++ интерфейсом можно считать класс с чисто виртуальными методами

Чисто виртуальный метод - это метод класса, который определяется как виртуальный и которому присваивается значение 0

class ITest
{
public:
virtual ~ITest() {}
virtual void Method() = 0;
};

class MainTest : public ITest
{
public:
virtual void Method() override
{
}
};
🧨 Как установить, очистить и переключить один бит?

❗️Установка бита

- Используется побитовый оператор OR (|), чтобы установить n-й бит number в 1 значение
- Стоит помнить, что сдвиг больше, чем на ширину типа, является неопределенным поведением

typedef unsigned long ulong;

ulong bit_set(ulong number, ulong n) {
return number | ((ulong)1 << n);
}


❗️Очистка бита

- Используется побитовый оператор AND (&) , чтобы установить n-й бит number в 0 значение
- Вы должны инвертировать битовую строку с помощью побитового оператора NOT (~) , затем оператор &
ulong bit_clear(ulong number, ulong n) {
return number & ~((ulong)1 << n);
}


❗️Переключение бита

- Используйте побитовый оператор XOR (^) для переключения n-го бита number

ulong bit_toggle(ulong number, ulong n) {
return number ^ ((ulong)1 << n);
}


❗️Проверка бита
- Чтобы проверить бит, сдвиньте number вправо на n бит , затем воспользуйтесь &

bool bit_check(ulong number, ulong n) {
return (number >> n)& (ulong)1;
}
🍔 Библиотека алгоритмов вычислительной геометрии CGAL

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

👉 Сайт
👉 Github
🌟 Выведение размера массива

Для std::array размер в общем случае задаётся вручную
std::array<int, 2> test{ 2,3 };


Начиная с C++17 можно оставить вывод размера компилятору
std::array test{ 2,3 };


Но если необходимо использовать шаблоны, то можно воспользоваться шаблонной магией
template<typename T, size_t N>
int size(const std::array<T, N>& types)
{
    return N;
}
В каких случаях применяется инициализация нулями?

- Статические переменные (static), глобальные и thread_local
thread_local int a; // thread_local

int b; // global

struct Test {
static int test; // static
};

int Test::test;


- Если мы инициализируем default значениями примитивных типов
void dunc(int t){}

f(int());


- Для явно не инициализированных Си-массивов
char a[5] = "123"; //  a[3] = a[4] = 0
🅾️ Что такое «О» большое: объясняем на простых примерах

«О» большое (Big O notation) — это математическая нотация, которая позволяет оценить, как изменяется время выполнения алгоритма или объём используемой памяти в зависимости от размера входных данных.

Мы написали подробный гайд по видам сложности, проиллюстрировав их понятными примерами.

🔗 Читать статью
🔗 Зеркало
Как получить размер файла в байтах?

В C++17 была добавлена библиотека filesystem, которая упрощает работу с файловой системой

#include <filesystem>

int main()
{
std::uintmax_t size = std::filesystem::file_size("file.txt");
}


❗️Стоит учитывать, что если файл был открыт не только вами, то размер может быть изменён извне
🌳 Разница между кучей и стеком

• Стек непрерывен, но куча не обязательно непрерывна
• Существуют разные способы применения.Стек автоматически выделяется операционной системой, а кучей приходится управлять вручную
• Стек растет от большего адреса к меньшему, куча растет от меньшего адреса к большему
• Временем жизни стека управляет система и в большинстве случаев доступ к нему более быстрый. Куча же может распределяться неравномерно по памяти и подвержена внутренней фрагментации
🔮 В чем разница между статическим выделением памяти и динамическим выделением памяти?

- Статическое выделение памяти выполняется во время компиляции и не потребляет ресурсов ЦП; динамическое выделение памяти выполняется во время выполнения, а для выделения и освобождения требуются ресурсы ЦП
- Динамическое выделение памяти может привести к утечке памяти
- Для выделения статической памяти не требуется поддержка указателей. Для динамического выделения памяти требуется
- Статическое выделение памяти выполняется по плану, и размер блока памяти определяется перед компиляцией. Динамическое выделение памяти выполняется по мере необходимости
- Статическое выделение памяти дает контроль над памятью компилятору. Динамическое выделение памяти дает контроль над памятью программисту
🎤 Как не облажаться с докладом на IT-конференции

Готовитесь к докладу на IT-конференции? Не хотите оказаться в роли «того самого» докладчика, на которого все жалуются в кулуарах? Узнайте, как не облажаться и сделать свой доклад полезным и запоминающимся.

🔗 Читать статью
🔗 Зеркало
🌳 Разговор о производительности

Монолог и немного дискуссии с аудиторией о производительности, проблемах разработчиков, и вообще жизни🙂

Краткое содержание
• Обсуждение производительности кода
• Опыт оптимизации производительности
• Влияние компилятора и линковщика на производительность
• Поиск узких мест в коде
• Практические советы
• Обсуждение оптимизации кода
• Анекдоты и рефлексы программистов
• Обсуждение проблем с синтаксисом и управлением памятью
• Примеры из практики

👉 Ссылка
🗝️ 40 незаменимых API для разработчиков

Разработчики постоянно ищут способы оптимизировать свою работу. Мы собрали 40 API, которые помогут вам сэкономить время, повысить эффективность и добавить новые функции в ваши проекты.

🔗 Читать статью
🔗 Зеркало
Please open Telegram to view this post
VIEW IN TELEGRAM
😱 Как объединить строки в C?

В Си строки - это просто массивы char'ов. Следовательно, мы не можем напрямую объединить их с другими строками

Мы можем использовать strcat функцию, которая добавляет строку, на которую указывает src, в конец строки, на которую указывает dest:

char *strcat(char *dest, const char *src);


❗️dest выполняет роль буфера назначения. Буфер назначения должен быть буфером массива символов. Он должен быть больше суммарного размера двух строк: той которая в нём уже есть и той которая копируется

Пример:
char str[80];
strcpy(str, "these ");
strcat(str, "strings ");
strcat(str, "are ");
strcat(str, "concatenated.");


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

strcat(strcat(str, foo), bar);


Из всего выше сказанного объединить две строки можно с помощью
char *foo = "foo";
char *bar = "bar";
char str[80];
strcpy(str, "TEXT ");
strcat(str, foo);
strcat(str, bar);
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
⚡️Proglib запускает канал про ИИ для генерации звука

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

⭐️генерация голоса и музыки
⭐️замена и перевод речи
⭐️распознавание звуков

👉Подписывайтесь!
Please open Telegram to view this post
VIEW IN TELEGRAM
😱 В чем разница между вектором и списком?

std::vector — это реальный массив, а базовая реализация std::list — это двусторонне связанный список

std::vector поддерживает произвольный доступ с доступом за O(1), но производительность вставки и удаления в общем случае низкая. Но стоить отметить что вставка в конец если capacity больше size происходить за O(1)

Так же вставка и удаление из std::vector в узлах, отличных от хвоста, вызовет копирование памяти, в std::list такого не происходит

std::list не поддерживает произвольный доступ, но производительность вставки и удаления O(1)

std::vector хранится последовательно, список — нет

std::vector выделяет память сразу и увеличивает емкость в два раза, когда ее недостаточно. std::list будет обращаться за новой памятью каждый раз, когда вставляется новый узел
❤️ Активация с первого взгляда: как влюбить пользователя в продукт

Хотите научиться превращать случайных посетителей в преданных фанатов? Рассказываем, как повысить активацию пользователей, отличить ее от aha-момента и использовать эти знания для кратного роста количества активных пользователей.

🔗 Читать статью
🔗 Зеркало