РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
346 of 815 menu

Категория 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,
    которая сдвигает итератор на заданное число позиций
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить