Программирование. Принципы и практика использования C++ Исправленное издание, стр. 335
void init(Matrix<int,2>& a) // инициализация каждого элемента // характеристическим значением{ for (int i=0; i<a.dim1(); ++i) for (int j = 0; j<a.dim2(); ++j) a(i,j) = 10*i+j;}void print(const Matrix<int,2>& a) // вывод элементов построчно{ for (int i=0; i<a.dim1(); ++i) { for (int j = 0; j<a.dim2(); ++j) cout << a(i,j) <<'\t'; cout << '\n'; }}
dim1()dim2()MatrixMatrixvoid init(Matrix& a); // ошибка: пропущены тип элементов // и количество размерностейОбратите внимание на то, что библиотека
MatrixMatrix24.5.2. Одномерный объект класса Matrix
Что можно сделать с простейшим объектом класса
MatrixКоличество размерностей в объявлении такого объекта можно не указывать, потому что по умолчанию это число равно единице.
Matrix<int,1> a1(8); // a1 — это одномерная матрица целых чиселMatrix<int> a(8); // т.е. Matrix<int,1> a(8);Таким образом, объекты
aa1Matrix<int,1>MatrixMatrixa.size(); // количество элементов в объекте класса Matrixa.dim1(); // количество элементов в первом измеренииМожно также обращаться к элементам матрицы, используя схему их размещения в памяти, т.е. через указатель на ее первый элемент.
int* p = a.data(); // извлекаем данные с помощью указателя на массивЭто полезно при передаче объектов класса
Matrixa(i); // i-й элемент (в стиле языка Fortran) с проверкой // диапазонаa[i]; // i-й элемент (в стиле языка C) с проверкой диапазонаa(1,2); // ошибка: a — одномерный объект класса MatrixМногие алгоритмы обращаются к части объекта класса
Matrixslice()MatrixMatrixa.slice(i); // элементы, начиная с a[i] и заканчивая последнимa.slice(i,n); // n элементов, начиная с a[i] и заканчивая a[i+n–1]Индексы и срезки можно использовать как в левой части оператора присваивания, так и в правой. Они ссылаются на элементы объекта класса
Matrixa.slice(4,4) = a.slice(0,4); // присваиваем первую половину матрицы // второйНапример, если объект a вначале выглядел так:
{ 1 2 3 4 5 6 7 8 }то получим
{ 1 2 3 4 1 2 3 4 }Обратите внимание на то, что чаще всего срезки задаются начальными и последними элементами объекта класса
Matrixa.slice(0,j)[0:j]a.slice(j)[j:a.size()]a.slice(4) = a.slice(0,4); // присваиваем первую половину матрицы // второйИначе говоря, обозначения — дело вкуса. Вы можете указать такие индексы
ina.slice(i,n)aaa.slice(i,a.size())[i:a.size()]a.slice(a.size())a.slice(a.size(),2)Matrixa.slice(i,0)Matrixa.slice(i,n)n0