Чтение онлайн

на главную - закладки

Жанры

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
рейтинг книги
Имперский Курьер. Том 3

"Никто" так не смотрит

Кистяева Марина
Территория любви
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Никто так не смотрит

Любимая учительница

Зайцева Мария
1. совершенная любовь
Любовные романы:
современные любовные романы
эро литература
8.73
рейтинг книги
Любимая учительница

Офицер-разведки

Поселягин Владимир Геннадьевич
2. Красноармеец
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Офицер-разведки

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Искушение генерала драконов

Лунёва Мария
2. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Искушение генерала драконов

Неверный. Свободный роман

Лакс Айрин
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Неверный. Свободный роман

Черный Маг Императора 15

Герда Александр
15. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
фантастика: прочее
5.00
рейтинг книги
Черный Маг Императора 15

Темный Патриарх Светлого Рода

Лисицин Евгений
1. Темный Патриарх Светлого Рода
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода

Наследник павшего дома. Том II

Вайс Александр
2. Расколотый мир [Вайс]
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том II

Возвышение Меркурия. Книга 16

Кронос Александр
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16

Пробуждение. Пятый пояс

Игнатов Михаил Павлович
15. Путь
Фантастика:
фэнтези
уся
5.00
рейтинг книги
Пробуждение. Пятый пояс