C++. Сборник рецептов
Шрифт:
Отсутствие в
valarray
функций-членов begin
и end
, несомненно, противоречит стилю STL. Отсутствие этих функций подчеркивает то, что в valarray
реализуется модель, отличная от концепции контейнера STL. Несмотря на это, вы можете использовать valarray
в любом обобщенном алгоритме, где требуется итератор с произвольным доступом. 11.9. Представление числового вектора фиксированного размера
Проблема
Требуется
Решение
В программном обеспечении обычного типа часто более эффектный результат по сравнению с
valarray
дает применение специальной реализации вектора, когда его размер заранее известен на этапе компиляции. Пример 11.17 показывает, как можно реализовать шаблон вектора фиксированного размера, названный здесь kvector
. Пример 11.17. kvector.hpp
#include <algorithm>
#include <cassert>
template<class Value_T, unsigned int N>
class kvector {
public:
// открытые поля
Value_T m[N];
// открытые имена, вводимые typedef
typedef Value_T value_type;
typedef Value_T* iterator;
typedef const Value_T* const_iterator;
typedef Value_T& reference;
typedef const Value_T& const_reference;
typedef size_t size_type;
// определение более короткого синонима для kvector
typedef kvector self;
// функции-члены
template<typename Iter_T>
void copy(Iter_T first, Iter_T last) {
copy(first, last, begin);
}
iterator begin { return m; }
iterator end { return m + N; }
const_iterator begin const { return m; }
const_iterator end const { return m + N; }
reference operator[](size_type n) { return m[n]; }
const_reference operator[](size_type n) const { return m[n]; }
static size_type size { return N; }
// векторные операции
self& operator+=(const self& x) {
for (int i=0; i<N; ++i) m[i] += x.m[i];
return *this;
}
self& operator-=(const self& x) {
for (int i=0; i<N; ++i) m[i] -= x.m[i];
return *this;
}
//
скалярные операции
self& operator=(value_type x) {
std::fill(begin, end, x);
return *this;
}
self& operator+=(value_type x) {
for (int i=0; i<N; ++i) m[i] += x;
return *this;
}
self& operator-=(value_type x) {
for (int i=0; i<N; ++i) m[i] -= x;
return *this;
}
self& operator*=(value_type x) {
for (int i=0; i<N; ++i) m[i] *= x;
return *this;
}
self& operator/=(value_type x) {
for (int i=0; i<N; ++i) m[i] /= x;
return *this;
}
self& operator%=(value_type x) {
for (int i=0; i<N; ++i) m[i] %= x;
return *this;
}
self operator- {
self x;
for (int i=n; i<N; ++i) x.m[i] = -m[i];
return x;
}
// дружественные операторы
friend self operator+(self x, const self& y) { return x += у; }
friend self operator-(self x, const self& y) { return x -= y; }
friend self operator+(self x, value_type y) { return x += y; }
friend self operator-(self x, value_type y) { return x -= y; }
friend self operator*(self x, value_type y) { return x *= y; }
friend self operator/(self x, value_type y) { return x /= y; }
friend self operator%(self x, value type y) { return x %= y; }
};
Пример 11.18 показывает, как можно применять шаблон класса
kvector
. Пример 11.18. Применение вектора kvector
#include "kvector.hpp"
#include <algorithm>
#include <numeric>
#include <iostream>
Поделиться:
Популярные книги
Сами мы не местные
2. Замуж с осложнениями
Фантастика:
юмористическая фантастика
космическая фантастика
9.35
рейтинг книги
Имперский Курьер. Том 3
3. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
"Никто" так не смотрит
Территория любви
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Любимая учительница
1. совершенная любовь
Любовные романы:
современные любовные романы
эро литература
8.73
рейтинг книги
Офицер-разведки
2. Красноармеец
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
На Ларэде
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
Дочь моего друга
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Искушение генерала драконов
2. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Неверный. Свободный роман
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Черный Маг Императора 15
15. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
фантастика: прочее
5.00
рейтинг книги
Темный Патриарх Светлого Рода
1. Темный Патриарх Светлого Рода
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том II
2. Расколотый мир [Вайс]
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Пробуждение. Пятый пояс
15. Путь
Фантастика:
фэнтези
уся
5.00