Программирование. Принципы и практика использования C++ Исправленное издание, стр. 337
Класс
MatrixMatrixvoid 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Обратите внимание на то, что компилятор может самостоятельно определить количество элементов в инициализированном массиве, поэтому это число при определении объекта
constants4datapn24.5.3. Двумерный объект класса Matrix
Общая идея библиотеки
MatrixMatrixMatrix<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]MatrixiMatrix(a[i].data())a(i,j)a[i][j]
Мы можем получить срезки.
a.slice(i); // строки от a[i] до последнейa.slice(i,n); // строки от a[i] до a[i+n–1]
Срезка двумерного объекта класса
MatrixMatrix<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()[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};Matrix<Piece> start_row(init_pos); // инициализация элементов из // init_posMatrix<Piece> clear_row(8); // 8 элементов со значениями