Программа примера 11.29 выдает следующий результат.
(2,0)
(0,2)
Обсуждение
Проект шаблона матрицы, представленный в примере 11.28, в значительной степени инспирирован шаблоном матрицы Бьерна Страуструпа (Bjarne Stroustrup) из его книги «The C++ Programming Language», 3-е издание (издательство «Addison Wesley»). Реализация Страуструпа отличается тем, что его итератор использует класс
slice
и указатель на
valarray
для индексации. Реализованная в примере 11.27 матрица использует вместо них итератор с шагом из рецепта 11.12, что делает итераторы более компактными и при некоторых реализациях более эффективными.
Шаблонный класс
matrix
позволяет индексировать элемент i– й строки и j– го столбца, используя операцию двойной индексации. Например:
matrix<int> m(100,100);
cout << "the element at row 24 and column 42 is " << m[24][42] << endl;
Шаблонный класс
matrix
также имеет функции-члены
begin
и
end
, т.е. его легко можно использовать в различных алгоритмах STL.
Пример 11.28 содержит строку, которая, возможно, вызывает у вас некоторое удивление. Имеется в виду следующее объявление.
mutable valarray<Value_T> m;
Объявление поля-члена
m
со спецификатором
mutable
вынужденно. В противном случае я не мог бы обеспечить итераторы со спецификатором
const
, потому что нельзя создать итератор для
const valarray
.
Смотри также
Рецепты 11.15 и 11.16.
11.15. Реализация статической матрицы
Проблема
Требуется эффективно реализовать матрицу, когда ее размерность (т.е. количество строк и столбцов) постоянна и известна на этапе компиляции.
Решение
Когда размерность матрицы известна на этапе компиляции, компилятор может легко оптимизировать реализацию,
в которой количество строк и столбцов задается в виде параметров шаблона, как показано в примере 11.30.