Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

// доски

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
. И так далее.

  • Читать дальше
  • 1
  • ...
  • 385
  • 386
  • 387
  • 388
  • 389
  • 390
  • 391
  • 392
  • 393
  • 394
  • 395
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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