Вы находитесь на странице: 1из 5

C++ book Выпуск 0.

окт. 11, 2022

Содержание

1 Простые алгоритмы 1
1.1 Разное . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.2 Алгоритмы обработки одномерных массивов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.3 Алгоритмы обработки матриц . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1 Простые алгоритмы
1.1 Разное

Обмен значений переменных (через вспомогательную переменную)

1 auto newFst = snd;


2 snd = fst;
3 fst = newFst;

Обмен значений переменных (без вспомогательной переменной)

1 std::swap(fst, snd);

1.2 Алгоритмы обработки одномерных массивов

Инициализация массива

Массив может быть инициализирован через списк инициализаторов в фигурных скобках. Если размер массива

превосходит длину списка, то оставшимся элементам массива присваивается значение умолчательно сконстру-

ированного элемента массива.

1 std::array<int, 10> arr{0};

Для std::vector список определяет количество элементов в динамическом массиве.

1 std::vector<int> arr{1, 2, 3, 4, 5};

1
Заполнение массива

Заполнение массива четными числами по возрастанию

1 for (int i = 0; i < std::ssize(arr); i += 1) {


2 arr[i] = i * 2;
3 }

Заполнение массива нечетными числами по возрастанию

1 for (int i = 0; i < std::ssize(arr); i += 1) {


2 arr[i] = 1 + i * 2;
3 }

Печать одномерного массива

1 std::cout << '[';


2 for (int i = 0; i < std::ssize(arr); i += 1) {
3 std::cout << arr[i] << (std::ssize(arr) - 1 != i ? ' ' : ']');
4 }

Инвертирование одномерного массива

1 const auto n = std::ssize(arr);


2 for (int i = 0; i < n / 2; i += 1) {
3 std::swap(arr[i], arr[n - 1 - i]);
4 }

Поиск экстремального элемента в одномерном массиве

Экстремальный элемент - минимум или масимум

Алгоритм поиска значения максимального элемента в массиве.

1 const auto n = std::ssize(arr);


2 auto maxVal = arr[0];
3 for (int i = 1; i < n; i += 1) {
4 if (maxVal < arr[i]) {
5 maxVal = arr[i];
6 }
7 }

Поиск индекса экстремального элемента в одномерном массиве

Алгоритм поиска индекса элемента с максимальным значением в массиве.

1 const auto n = std::ssize(arr);


2 int iMax = 0;
3 for (int i = 1; i < n; i += 1) {
4 if (arr[iMax] < arr[i]) {
5 iMax = i;
6 }
7 }

2
Поиск индекса первого вхождения элемента

Если элемент не найден, результатом поиска считаем -1.

1 const auto n = std::ssize(arr);


2 int i = 0;
3 for (; i < n; i += 1) {
4 if (val == arr[i]) {
5 break;
6 }
7 }
8 i = n != i ? i : -1;

Поиск индекса последнего вхождения элемента

Если элемент не найден, результатом поиска считаем -1.

1 const auto i = std::ssize(arr);


2 for (; 0 <= i; i -= 1) {
3 if (val == arr[i]) {
4 break;
5 }
6 }

Вставка элемента в одномерный массив

1 const auto n = std::ssize(arr);


2 arr.resize(n + 1);
3 for (auto i = n; id < i; i -= 1) {
4 arr[i] = arr[i - 1];
5 }
6 arr[id] = val;

Уаление элемента в одномерном массив

1 const auto n = std::ssize(arr);


2 for (auto i = id; i < n - 1; i += 1) {
3 arr[i] = arr[i + 1];
4 }
5 arr.resize(n - 1);

Конкатенация одномерных массивов

1 const auto n1 = std::ssize(ar1);


2 const auto n2 = std::ssize(ar2);
3 const auto nr = n1 + n2;
4 auto nMin = std::min(n1, n2);
5 for (int i = 0; i < nMin; i += 1) {
6 arf[i * 2] = ar1[i];
7 arf[i * 2 + 1] = ar2[i];
8 }
9 if (n2 < n1) {
10 for (auto i = nMin; i < n1; i += 1) {
11 arf[nMin + i] = ar1[i];
(continues on next page)

3
(продолжение с предыдущей страницы)

12 }
13 } else {
14 for (auto i = nMin; i < n2; i += 1) {
15 arf[nMin + i] = ar2[i];
16 }
17 }

Слияние одномерных массивов (поочередное)

1 const auto n1 = std::ssize(ar1);


2 const auto n2 = std::ssize(ar2);
3 const auto nr = n1 + n2;
4 auto nMin = std::min(n1, n2);
5 for (int i = 0; i < nMin; i += 1) {
6 arf[i * 2] = ar1[i];
7 arf[i * 2 + 1] = ar2[i];
8 }
9 if (n2 < n1) {
10 for (auto i = nMin; i < n1; i += 1) {
11 arf[nMin + i] = ar1[i];
12 }
13 } else {
14 for (auto i = nMin; i < n2; i += 1) {
15 arf[nMin + i] = ar2[i];
16 }
17 }

1.3 Алгоритмы обработки матриц

Создание матрицы (std::array)

фиксированый размер, список инициализаторов

1 std::array<std::array<int, 3>, 2> m23{{


2 { 3, 2, 1},
3 { 8, 7, 6}}};

Создание матрицы (фиксированый размер, std::vector)

размер определяется автоматически через список инициализаторов

1 std::vector<std::vector<int>> m44{
2 { 1, 1, 1, 1 },
3 { 1, 1, 1, 1 },
4 { 1, 1, 1, 1 }
5 };

4
Создание матрицы (std::vector)

размер определяется параметрами, одно значение заполнение

1 std::vector<std::vector<int>> m;
2 for (ptrdiff_t iRow = 0; iRow < nRow; iRow +=1 ) {
3 m[iRow].resize(nCol, val);
4 }

Печать матрицы

1 const auto nRow = std::ssize(arr);


2 const auto nCol = std::ssize(arr[0]);
3 for (int iRow = 0; iRow < nRow; iRow+= 1) {
4 for (int iCol = 0; iCol < nCol; iCol += 1) {
5 std::cout << arr[iRow][iCol] << (nCol - 1 != iCol ? ' ' : '\n');
6 }
7 }

Диагонали квадратной матрицы

На главной диагонали элементы имеют индексы 𝑖𝑅𝑜𝑤 == 𝑖𝐶𝑜𝑙.


На побочной диагонали элементы имеют индексы 𝑛𝑅𝑜𝑤 − 1 − 𝑖𝑅𝑜𝑤 == 𝑖𝐶𝑜𝑙.

Перестановка строк или столбцов в матрице

Достигается перестаовкой элементов пары строк или столбцов, которые мы хотим переставить.

Транспонирование матрицы

В матрицу с соответствующими размерами копируются элементы исходной.

Транспонирование квадратной матрицы (по месту)

1 const auto nRow = std::ssize(m);


2 const auto nCol = std::ssize(m[0]);
3 for (int iRow = 0; iRow < nRow; iRow += 1) {
4 for (int iCol = iRow + 1; iCol < nCol; iCol += 1) {
5 std::swap(m[iRow][iCol], m[iCol][iRow]);
6 }
7 }

Вам также может понравиться