Архитектурная акустика/Реализация/IteratorAdapterForStep
Перейти к навигации
Перейти к поиску
Итератор-адаптер, преобразующий интерфейс итератора с произвольным доступом так, чтобы переход на одну позицию соответствовал переходу адаптируемого итератора на заданное шагом число позиций.
template <class _BaseRandomIterator>
class IteratorAdapterForStep;
_BaseRandomIterator | Тип преобразуемого адаптером итератора. Должен удовлетворять требованиям RandomAccessIterator. |
Открытые типы
Тип | Описание |
---|---|
iterator | Тип _BaseRandomIterator. |
iterator_category | Категория итератора. Тип эквивалентен std::random_access_iterator_tag. |
value_type | Тип typename std::iterator_traits<iterator>::value_type . |
reference | Тип typename std::iterator_traits<iterator>::reference . |
pointer | Тип typename std::iterator_traits<iterator>::pointer . |
difference_type | Тип typename std::iterator_traits<iterator>::difference_type . |
Открытые методы
Метод | Описание |
---|---|
(конструкторы) | Конструкторы класса IteratorAdapterForStep. |
operator= | Операторы присваивания. |
operator* | Оператор разыменовывания. |
operator-> | Оператор косвенного доступа к элементам. |
operator++ | Сдвиг позиции итератора на единицу от начала. |
operator-- | Сдвиг позиции итератора на единицу к началу. |
operator+= | Изменение позиции итератора на заданное число элементов к концу. |
operator-= | Изменение позиции итератора на заданное число элементов к началу. |
operator+ | Возвращает итератор, сдвинутый к концу относительно текущего на заданное число позиций. |
operator- | Возвращает итератор, сдвинутый к началу относительно текущего на заданное число позиций, либо расстояние между двумя итераторами. |
operator== | Проверка на эквивалентность итераторов. |
operator!= | Проверка на неэквивалентность итераторов. |
operator< | Проверка на то, чтобы текущий итератор находился ближе к первому элементу множества, на котором он определен, по сравнению с итератором, который указан параметром. |
operator<= | Проверка на то, чтобы текущий итератор находился ближе к первому элементу множества, на котором он определен, по сравнению с итератором, который указан параметром, либо совпадал с ним. |
operator> | Проверка на то, чтобы текущий итератор находился дальше от первого элемента множества, на котором он определен, по сравнению с итератором, который указан параметром. |
operator>= | Проверка на то, чтобы текущий итератор находился дальше от первого элемента множества, на котором он определен, по сравнению с итератором, который указан параметром, либо совпадал с ним. |
base | Возвращает адаптируемый итератор в текущей позиции. |
adaptation_base | Возвращает текущий корневой адаптированный, возможно цепочкой адаптеров, итератор. |
Функции, не являющиеся частью определения класса
Функция | Описание |
---|---|
operator+ | Создает копию указанного итератора IteratorAdapter2D, сдвинутую относительно него на заданное число позиций. |
Любой итератор IteratorAdapterForStep, который соответствует позиции, соответствующей псевдоэлементу множества, на котором определен итератор, за последним элементом, считается эквивалентным итератору, возвращаемому методом end этого множества.
Класс IteratorAdapterForStep поддерживает изменение позиции любого итератора, в т.ч. соответствующего итераторам, позиции элементов которых больше либо равны итератору, возвращаемому методом end множества - независимо от такой поддержки адаптируемым итератором.
Пример
using namespace Chusov::Math;
Matrix<double> m =
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
std::vector<std::thread> vecThreads;
for (unsigned i = 0; i < std::thread::hardware_concurrency(); ++i)
vecThreads.emplace_back([&vecThreads, i, &m]()
{
for (auto it = make_iterator_adapter<IteratorAdapterForStep>(i, std::thread::hardware_concurrency(), adapt_iterator_range<IteratorAdapter2D>(m.begin(), m.end()));
it.adaptation_base() != m.end(); ++it)
*it *= 2;
});
for (auto&& thr:vecThreads)
thr.join();
std::cout << "\nSequentialized matrix elements multiplied by two: ";
for (auto&& elem:adapt_iterator_range<IteratorAdapter2D>(m.begin(), m.end()))
std::cout << elem << " ";
vecThreads.clear();