11.8. Представление динамического числового вектора
11.8. Представление динамического числового вектора
Проблема
Требуется иметь тип для манипулирования динамическими числовыми векторами.
Решение
Вы можете использовать шаблон valarray из заголовочного файла <valarray>. Пример 11.15 показывает, как можно использовать шаблон valarray.
Пример 11.15. Применение шаблона valarray
#include <valarray>
#include <iostream>
using namespace std;
int main() {
valarray<int> v(3);
v[0] = 1;
v[1] = 2;
v[2] = 3;
cout << v[0] << ", " << v[1] << ", " << v[2] << endl;
v = v + v;
cout << v[0] << ", " << v[1] << ", " << v[2] << endl;
v /= 2;
cout << v[0] << ", " << v[1] << ", " << v[2] << endl;
}
Программа примера 11.15 выдаст следующий результат.
1, 2, 3
2, 4, 6
1, 2, 3
Обсуждение
Вопреки своему названию тип vector не предназначен для использования в качестве числового вектора, для этой цели используется шаблон valarray. Этот шаблон написан так, чтобы в конкретных реализациях С++, особенно на высокопроизводительных машинах, можно было применить к нему специальную векторную оптимизацию. Другое большое преимущество valarray состоит в наличии многочисленных перегруженных операторов, предназначенных для работы с числовыми векторами. Эти операторы обеспечивают выполнение таких операций, как сложение и скалярное умножение векторов.
Шаблон valarray может также использоваться в стандартных алгоритмах, работающих с массивами, представленными в C-стиле. Пример 11.16 показывает, как можно создавать итераторы, ссылающиеся на начальный элемент valarray и на элемент, следующий за последним.
Пример 11.16. Получение итераторов для valarray
template<class T>
T* valarray_begin(valarray<T>& x) {
return &x[0];
}
template<class T> T* valarray_end(valarray<T>& x) {
return valarray_begin(x) + x.size();
}
Несмотря на немного академичный вид этого примера, не следует пытаться создавать итератор конца valarray, используя выражение &x[х.size()]. Если это сработает, то только случайно, поскольку индексация valarray, выходящая за допустимый индексный диапазон, приводит к непредсказуемому результату.
Отсутствие в valarray функций-членов begin и end, несомненно, противоречит стилю STL. Отсутствие этих функций подчеркивает то, что в valarray реализуется модель, отличная от концепции контейнера STL. Несмотря на это, вы можете использовать valarray в любом обобщенном алгоритме, где требуется итератор с произвольным доступом.