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

на главную

Жанры

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

Matrix<Piece> start_row(init_pos); // инициализация элементов из

// init_pos

Matrix<Piece> clear_row(8); // 8 элементов со значениями

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

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

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
не выходит за пределы допустимого диапазона).

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

Matrix
(например, в физическом моделировании в декартовой системе координат).

int grid_nx; // разрешение сетки; задается вначале

int grid_ny;

int grid_nz;

Matrix<double,3> cube(grid_nx, grid_ny, grid_nz);

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

Matrix
. И так далее.

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

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

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

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

В зоне особого внимания

Иванов Дмитрий
12. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
В зоне особого внимания

Кровавая весна

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

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

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

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Начальник милиции. Книга 3

Дамиров Рафаэль
3. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 3

Не грози Дубровскому!

Панарин Антон
1. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому!

Свадьба по приказу, или Моя непокорная княжна

Чернованова Валерия Михайловна
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Свадьба по приказу, или Моя непокорная княжна

Муж на сдачу

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Муж на сдачу

Кодекс Крови. Книга I

Борзых М.
1. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга I

Польская партия

Ланцов Михаил Алексеевич
3. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Польская партия

Лорд Системы

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

Газлайтер. Том 2

Володин Григорий
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 2