Библиотека задач по C++ | тесты, код, задания
5.23K subscribers
575 photos
1 video
162 links
Задачи и тесты по C++ для тренировки и обучения.

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

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

Работать у нас: https://job.proglib.io/

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
Форматирование текста в С++20

std::format — это функция форматирования текста, которая появилась в C++20. Она предлагает безопасную и расширяемую альтернативу семейству функций printf. Эта функция предназначена для дополнения существующей библиотеки C++ I/O streams.

В этом примере мы используем std::format для форматирования строки «Hello, {}!», где {} является заполнителем для аргумента «world». Результатом работы этого кода будет строка «Hello, world!», которая выводится на экран с помощью std::cout.
Ссылочный и переменный указатель. В чём разница?

Ссылочный указатель — это ссылка на объект. Ссылочный указатель не хранит адрес объекта, а сам является ссылкой на объект. Ссылочный указатель всегда ссылается на один и тот же объект, даже если его значение изменится.

Переменный указатель — это указатель на объект. Переменный указатель хранит адрес объекта. Значение переменного указателя может быть изменено, и в этом случае указатель будет ссылаться на другой объект.
std::variant

Это фича C++17, обеспечивающая типобезопасное объединение, позволяющее хранить и манипулировать значениями разных типов в одном объекте. Она является частью стандартной библиотеки C++ и определена в заголовке .

Шаблонный класс std::variant похож на упрощенную версию union, но с дополнительной безопасностью типов и поддержкой различных операций.

Основными функциями std::variant являются index(), valueless_by_exception(), operator=, emplace.

В этом примере мы создаем объект var, который может содержать значения типов int, float или std::string. Мы присваиваем var различные значения и получаем их с помощью std::get.

Однако если мы попытаемся получить значение, используя неправильный тип (например, std::get(var), когда вариант содержит std::string), это вызовет исключение std::bad_variant_access.
Сырые указатели

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

Однако, следует помнить, что при использовании сырых указателей нет автоматического управления памятью, и программист должен самостоятельно следить за выделением и освобождением памяти.
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
std::allocator: современный способ управления памятью

• C++ предоставляет стандартный класс std::allocator, который упрощает управление памятью, особенно при работе с контейнерами STL
• О нём стоит помнить, потому что он передаётся по умолчанию в STL контейнеры
Вывод типа шаблона (Template Type Deduction)

⚙️ Начиная с C++11 появилась возможность переложить вывод типа на компилятор — вывод типа шаблона (Template Type Deduction)

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

std::fill — это функция из стандартной библиотеки algorithm, предназначенная для заполнения диапазона значениями одного и того же элемента
В докладе автор в лёгкой форме рассказывает о C++, его применение, особенностях и всё это переправлено мемами😆

Антон Соснин — С++ в мемах

#junior
🔍 Равенство трех значений

Создайте функцию, которая принимает три целочисленных аргумента (a, b, c) и возвращает количество целых чисел, которые имеют одинаковое значение

📚 Подход к решению
• Предполагается использование условных конструкций (if)

Equality of 3 Values

#junior #algorithms #tasks

💡Решение
int equal(int a, int b, int c) {
int count = 0;

if (a == b || a == c)
count = 2;

if (b == c)
if (count < 2)
count = 2;
else
count = 3;

return count;
}
equal_range

Функция equal_range используется для нахождения диапазона элементов в упорядоченном контейнере, которые имеют определенное значение. Она возвращает пару итераторов, представляющих начало и конец диапазона, в котором находятся элементы с указанным значением. Это полезно, когда вы хотите найти все элементы с определенным значением в упорядоченном контейнере, таком как std::set или std::map.

Прототип функции equal_range выглядит следующим образом:

std::pair equal_range(const Key& key);

Где:
iterator — тип итератора контейнера.
Key — значение, для которого нужно найти диапазон.
Перемешивание массива

Задача 1470 Shuffle the Array с leetcode

🔍 Условие
Дан массив nums, состоящий из 2n элементов в виде [x1,x2,...,xn,y1,y2,...,yn].
Нужно вернуть массив в виде [x1,y1,x2,y2,...,xn,yn]

📚 Подход к решению
• Из-за того что элемент x и y лежат друг от друга всегда на одинаковом расстоянии, то можно воспользоваться просто арифметической операцией сложения для поиска пары

#junior #algorithms #tasks

💡Решение
class Solution {
public:
vector shuffle(vector& nums, int n) {
vector result;
for (int i = 0; i < n; ++i) {
result.push_back(nums[i]);
result.push_back(nums[i + n]);
}
return result;
}
};
Ключевое слово «extern»

Ключевое слово «extern» используется для объявления переменных или функций, которые определены в других файловых единицах (обычно в других исходных файлах или библиотеках). Это позволяет программе получать доступ к переменным или функциям, которые находятся в других местах в коде.

Использование «extern» может быть полезным, когда вы хотите разделить определение переменных или функций между несколькими файлами, чтобы избежать повторного определения и обеспечить правильное связывание (линковку) программы.
Поиск дубликатов

Задача 217 Contains Duplicate с leetcode

🔍 Условие
• Учитывая целочисленный массив nums, вернуть true, если хотя бы одно значение появляется как минимум дважды в массиве, и вернуть false, если каждый элемент уникален

📚 Подход к решению
• Из-за того что уникальных элементов меньше или равно исходному размеру входного массива, то можно просто сравнить эти величины

#middle #algorithms #tasks

💡Решение
class Solution {
public:
bool containsDuplicate(vector& nums) {
set testSet(nums.begin(), nums.end());
return testSet.size() < nums.size();
}
};
Флажки компиляции

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

Флажки компиляции используются для различных целей, таких как оптимизация кода, установка целевой архитектуры, включение или выключение определенных функций и возможностей языка программирования, а также для управления процессом отладки и создания исполняемых файлов.
Задача Перемещение нулей

🔍 Условие
• Необходимо перенести все нули в конец массива, не меняя порядок следования ненулевых элементов
• Сделать всё надо in-place (на том же самом массиве)

📚 Подход к решению
• Воспользоваться методом двух указателей. Когда один указывает на предыдущий элемент, а другой на следующий. Если предыдущий нулевой, то менять со следующим

#middle #algorithms #tasks

💡Решение
class Solution {
public:
void moveZeroes(vector& nums) {
for (size_t i = 0, j = 0; i < nums.size(); ++i) {
if (nums[i])
swap(nums[i], nums[j++]);
}
}
};
Различие локальной переменной и поля класса с одинаковым именем

Указатель this может быть полезен в случае, когда локальная переменная в методе имеет то же самое имя, что и поле объекта:

void set(int x) { this->x = x; }

Здесь в методе set мы присваиваем полю класса x значение локальной переменной this. Чтобы различить поле класса x и локальную переменную с тем же именем мы используем запись this->x при обращении к полю класса.
Ханойская башня

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

Подсказки

• Можно использовать библиотеку <cmath>
• Можно использовать функцию возведения в степень pow

Tower of Hanoi (edabit)

#middle #algorithms #tasks

Решение
#include <cmath>
int towerHanoi(int discs) {
return pow(2, discs) — 1;
}
📋 Windowing method (Метод скользящего окна)

Метод скользящего окна — это подход к решению популярного типа алгоритмических задач

🔍 Принцип работы
• Определите размер окна (количество элементов данных в окне)
• Передвигайте окно по последовательности данных
• Вычисляйте интересующие вас значение
📋 Задача Как найти палиндром

Целое число является палиндромом, если оно читается одинаково как в прямом, так и в обратном направлении. Например, 121 является палиндромом, а 123 — нет

🔍 Условие

• Вернуть true, если x является палиндром и false в противном случае

📚 Подход к решению
• Чтобы понять палиндром это или нет необходимо развернуть число
• Это можно сделать с помощь деления на 10
• При целочисленном делении у нас остаётся число на одну цифру меньше (справа) и в остатке как раз эта цифра
• Цифру из остатка сохраняем
• После того как не осталось цифр в числе собираем новую из остатков (тех цифр которые сохранили

Palindrome Number (leetcode)

#junior #algorithms #tasks

💡Решение

class Solution {
public:
bool isPalindrome(int x) {
if (x < 0) {
return false;
}

long long reversed = 0;
long long temp = x;

while (temp != 0) {
int digit = temp % 10;
reversed = reversed * 10 + digit;
temp /= 10;
}

return (reversed == x);
}
};
Согласно C++ 11, спецификатор noexcept может быть применен к
Anonymous Quiz
16%
Классу
71%
Функции
6%
Переменной
7%
Пространству имен