Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

Одномерные массивы очень широко распространены; их можно представить как в виде встроенного массива, так и с помощью классов

vector
и
Matrix
. Класс
Matrix
следует применять тогда, когда необходимо выполнять матричные операции, такие как
*=
, или когда объект класса
Matrix
должен взаимодействовать с другими объектами этого класса, имеющими более высокую размерность.

Полезность этой библиотеки можно объяснить тем, что она лучше согласована с математическими операциями, а также тем,
что при ее использовании не приходится писать циклы для работы с каждым элементом матрицы. В любом случае в итоге мы получаем более короткий код и меньше возможностей сделать ошибку. Операции класса
Matrix
, например копирование, присваивание всем элементам и операции над всеми элементами, позволяют не использовать циклы (а значит, можно не беспокоиться о связанных с ними проблемах).

Класс

Matrix
имеет два конструктора для копирования данных из встроенных массивов в объект класса
Matrix
. Рассмотрим пример.

void some_function(double* p, int n)

{

double val[] = { 1.2, 2.3, 3.4, 4.5 };

Matrix<double> data(p,n);

Matrix<double> constants(val);

// ...

}

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

Matrix
.

Обратите внимание на то, что компилятор может самостоятельно определить количество элементов в инициализированном массиве, поэтому это число при определении объекта

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

24.5.3. Двумерный объект класса Matrix

Общая идея библиотеки

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

Matrix<int,2> a(3,4);

int s = a.size; // количество элементов

int d1 = a.dim1; // количество элементов в строке

int d2 = a.dim2; // количество элементов в столбце

int* p = a.data; // извлекаем данные с помощью указателя в стиле

// языка С

Мы можем запросить общее количество элементов и количество элементов в каждой размерности. Кроме того, можем получить указатель на элементы, размещенные в памяти в виде матрицы.

Мы можем использовать индексы.

a(i,j); // (i,j)-й элемент (в стиле языка Fortran) с проверкой

// диапазона

a[i]; // i-я строка (в стиле языка C) с проверкой диапазона

a[i][j]; // (i,j)-й элемент (в стиле языка C)

В двумерном объекте
класса
Matrix
индексирование с помощью конструкции
[i]
создает одномерный объект класса
Matrix
, представляющий собой
i
– ю строку. Это значит, что мы можем извлекать строки и передавать их операторам и функциям, получающим в качестве аргументов одномерные объекты класса
Matrix
и даже встроенные массивы
(a[i].data)
. Обратите внимание на то, что индексирование вида
a(i,j)
может оказаться быстрее, чем индексирование вида
a[i][j]
, хотя это сильно зависит от компилятора и оптимизатора.

Мы можем получить срезки.

a.slice(i); // строки от a[i] до последней

a.slice(i,n); // строки от a[i] до a[i+n–1]

Срезка двумерного объекта класса

Matrix
сама является двумерным объектом этого класса (возможно, с меньшим количеством строк). Распределенные операции над двумерными матрицами такие же, как и над одномерными. Этим операциям неважно, как именно хранятся элементы; они просто применяются ко всем элементам в порядке их следования в памяти.

Matrix<int,2> a2 = a; // копирующая инициализация

a = a2; // копирующее присваивание

a *= 7; // пересчет (и +=, –=, /= и т.д.)

a.apply(f); // a(i,j)=f(a(i,j)) для каждого элемента a(i,j)

a.apply(f,7); // a(i,j)=f(a(i,j),7) для каждого элемента a(i,j)

b=apply(f,a); // создаем новую матрицу с b(i,j)==f(a(i,j))

b=apply(f,a,7); // создаем новую матрицу с b(i,j)==f(a(i,j),7)

Оказывается, что перестановка строк также полезна, поэтому мы предусмотрим и ее.

a.swap_rows(1,2); // перестановка строк a[1] <–> a[2]

Перестановки столбцов
swap_columns
не существует. Если она вам потребуется, то вы сможете написать ее самостоятельно (см. упр. 11). Из-за построчной схемы хранения матриц в памяти строки и столбцы не совсем равноправны. Эта асимметрия проявляется также в том, что оператор
[i]
возвращает только строку (а для столбцов аналогичный оператор не предусмотрен). Итак, в тройке
(i,j)
первый индекс
i
выбирает строку. Эта асимметрия имеет глубокие математические корни.

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

enum Piece { none, pawn, knight, queen, king, bishop, rook };

Matrix<Piece,2> board(8,8); // шахматная доска

const int white_start_row = 0;

const int black_start_row = 7;

Piece init_pos[] = {rook,knight,bishop, queen,king,bishop,knight,rook};

Поделиться:
Популярные книги

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Последний из рода Демидовых

Ветров Борис
Фантастика:
детективная фантастика
попаданцы
аниме
5.00
рейтинг книги
Последний из рода Демидовых

Любовь Носорога

Зайцева Мария
Любовные романы:
современные любовные романы
9.11
рейтинг книги
Любовь Носорога

Авиатор: назад в СССР 12

Дорин Михаил
12. Покоряя небо
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 12

Толян и его команда

Иванов Дмитрий
6. Девяностые
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Толян и его команда

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Изгой. Пенталогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
9.01
рейтинг книги
Изгой. Пенталогия

Неудержимый. Книга IX

Боярский Андрей
9. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга IX

Невеста

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
эро литература
8.54
рейтинг книги
Невеста

Энфис 2

Кронос Александр
2. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 2

Убийца

Бубела Олег Николаевич
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Убийца

Лорд Системы

Токсик Саша
1. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
4.00
рейтинг книги
Лорд Системы

Делегат

Астахов Евгений Евгеньевич
6. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Делегат

Невеста напрокат

Завгородняя Анна Александровна
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Невеста напрокат