Категория random_access_iterator
Категория random_access_iterator - это одна из
категорий итераторов в C++. Итераторы этой категории
обладают всеми возможностями итераторов предыдущих
категорий, а также поддерживают произвольный доступ
к элементам контейнера за константное время. Это
означает, что к любому элементу можно обратиться
напрямую по индексу, как к элементу массива. Такие
итераторы поддерживают операции сложения и вычитания
с целыми числами, вычисление расстояния между двумя
итераторами, а также сравнения порядка
(меньше, больше, меньше или равно, больше или равно).
Первым параметром при работе с такими итераторами
обычно выступает сам итератор, а вторым - смещение
или другой итератор, с которым выполняется операция.
Синтаксис
// Проверка, является ли итератор итератором произвольного доступа
std::is_same<
std::iterator_traits<Iterator>::iterator_category,
std::random_access_iterator_tag
>::value
// Концепт (C++20)
std::random_access_iterator<Iterator>
// Операции, поддерживаемые итератором произвольного доступа
it + n
it - n
it += n
it -= n
it[n]
it2 - it1
it1 < it2
it1 > it2
it1 <= it2
it1 >= it2
Пример
Давайте проверим, является ли итератор вектора
итератором произвольного доступа, используя
iterator_traits:
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
int main()
{
using Iter = vector<int>::iterator;
bool res = is_same<
iterator_traits<Iter>::iterator_category,
random_access_iterator_tag
>::value;
cout << boolalpha << res << endl;
return 0;
}
Результат выполнения кода:
true
Пример
Давайте воспользуемся произвольным доступом к элементам вектора через итератор, применяя операции сложения, вычитания и индексации:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec = {1, 2, 3, 4, 5};
auto it = vec.begin();
cout << *(it + 2) << endl;
cout << *(it - 0) << endl;
cout << it[3] << endl;
it += 4;
cout << *it << endl;
auto dist = vec.end() - vec.begin();
cout << dist << endl;
return 0;
}
Результат выполнения кода:
3
1
4
5
5
Пример
Давайте отсортируем вектор с помощью
std::sort, который требует итераторы
произвольного доступа, и сравним итераторы
по порядку следования:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> vec = {5, 3, 1, 4, 2};
sort(vec.begin(), vec.end());
for (auto it = vec.begin(); it != vec.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
auto it1 = vec.begin();
auto it2 = vec.begin() + 2;
cout << boolalpha << (it1 < it2) << endl;
return 0;
}
Результат выполнения кода:
1 2 3 4 5
true
Пример
Давайте проверим, что итератор списка
std::list не является итератором
произвольного доступа, а является только
двунаправленным:
#include <iostream>
#include <list>
#include <iterator>
using namespace std;
int main()
{
using Iter = list<int>::iterator;
bool res = is_same<
iterator_traits<Iter>::iterator_category,
random_access_iterator_tag
>::value;
cout << boolalpha << res << endl;
return 0;
}
Результат выполнения кода:
false
Смотрите также
-
категория
bidirectional_iterator,
которая поддерживает движение в обе стороны -
категория
iterator,
которая является базовым понятием итератора -
функция
distance,
которая вычисляет расстояние между итераторами -
функция
advance,
которая сдвигает итератор на заданное число позиций