Литмир - Электронная Библиотека
A
A

                                   // по умолчанию

Инициализация объекта

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

Matrix<Piece> start_row
= {rook,knight,bishop,queen,king,bishop,knight,rook};

Однако он не работает (по крайней мере, пока не появится новая версия языка C++ (C++0x)), поэтому пока приходится прибегать к трюкам с инициализацией массива (в данном случае

init_pos
) и использовать его для инициализации объектов класса
Matrix
. Мы можем использовать объекты
start_row
и
clear_row
следующим образом:

board[white_start_row] = start_row;             // расставить белые фигуры

for (int i = 1; i<7; ++i) board[i] = clear_row; // очистить середину

                                                // доски

board[black_start_row] = start_row;             // расставить черные фигуры

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

[i]
, мы получили значение
lvalue
(см. раздел 4.3); иначе говоря, мы можем присвоить результат элементу
board[i]
.

24.5.4. Ввод-вывод объектов класса Matrix

Библиотека

Matrix
предоставляет очень простые средства для ввода и вывода одно- и двухмерных объектов класса
Matrix
:

Matrix<double> a(4);

cin >> a;

cout << a;

Этот фрагмент кода прочитает четыре разделенные пробелами числа типа

double
, заключенных в фигурные скобки; например:

{ 1.2 3.4 5.6 7.8 }

Вывод очень прост, поэтому мы просто можем увидеть то, что ввели. Механизм ввода-вывода двумерных объектов класса

Matrix
просто считывает и записывает последовательности одномерных объектов класса
Matrix
, заключенные в квадратные скобки. Рассмотрим пример.

Matrix<int,2> m(2,2);

cin >> m;

cout << m;

Он прочитает запись

{

  { 1 2 }

  { 3 4 }

}

Вывод очень похож.

Операторы

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

24.5.5. Трехмерный объект класса Matrix

По существу, трехмерные объекты класса

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

Matrix<int,3> a(10,20,30);

a.size();             // количество элементов

a.dim1();             // количество элементов в размерности 1

a.dim2();             // количество элементов в размерности 2

a.dim3();             // количество элементов в размерности 3

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

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

                      // с проверкой диапазона

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

                      // с проверкой диапазона

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

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

a.slice(i,j);         // строки от i-й до j-й

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

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

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

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

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

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

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

a.swap_rows(7,9);     // переставляет строки a[7] <–> a[9]

Если вы умеете работать с двумерными объектами класса

Matrix
, то сможете работать и с трехмерными. Например, здесь
a
— трехмерная матрица, поэтому
a[i]
— двумерная (при условии, что индекс
i
не выходит за пределы допустимого диапазона);
a[i][j]
— одномерная (при условии, что индекс
j
не выходит за пределы допустимого диапазона);
a[i][j][k]
— элемент типа
int
(при условии, что индекс
k
не выходит за пределы допустимого диапазона).

338
{"b":"847443","o":1}