Итераторы

Итератор — это объект, выполняющий в контейнере роль указателя. С помощью итератора можно перемещаться внутри контейнера и получать доступ к отдельным элементам. В классе basic_string определены следующие типы итераторов:

  • iterator — итератор. При увеличении значения итератор перемещается к концу строки. Пример объявления переменной:
std::string::iterator it;
  • const_iterator — константный итератор. Изменить значение, на которое ссылается итератор, нельзя. Пример объявления переменной:
std::string::const_iterator it;
  • reverse_iterator — обратный итератор. При увеличении значения итератор перемещается к началу строки. Пример объявления переменной:
std::string::reverse_iterator it;
  • const_reverse_iterator — константный обратный итератор. Изменить значение, на которое ссылается итератор, нельзя. Пример объявления переменной:
std::string::const_reverse_iterator it;

Присвоить значения переменным позволяют следующие методы:

  • begin() — возвращает итератор, установленный на первый символ строки. Прототипы метода:
iterator begin() noexcept;
const_iterator begin() const noexcept;

Выведем первый символ строки:

std::string str("String");
std::basic_string<char>::iterator it;
it = str.begin();
std::cout << *it << std::endl; // S

Вместо метода begin() можно воспользоваться шаблонной функцией begin():

std::string str("String");
std::basic_string<char>::iterator it = std::begin(str);
std::cout << *it << std::endl; // S
  • end() — возвращает итератор, установленный на позицию после последнего символа строки. Прототипы метода:
iterator end() noexcept;
const_iterator end() const noexcept;

Выведем последний символ строки:

std::string str("String");
std::string::iterator it;
it = str.end();
std::cout << *(--it) << std::endl; // g

Вместо метода end() можно воспользоваться шаблонной функцией end():

std::string str("String");
std::string::iterator it = std::end(str);
std::cout << *(--it) << std::endl; // g
  • cbegin() — возвращает константный итератор, установленный на первый символ строки. Прототип метода:
const_iterator cbegin() const noexcept;
  • cend() — возвращает константный итератор, установленный на позицию после последнего символа строки. Прототип метода:
const_iterator cend() const noexcept;
  • rbegin() — возвращает обратный итератор, установленный на последний символ строки. Прототипы метода:
reverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const noexcept;

Выведем последний символ строки:

std::string str("String");
std::string::reverse_iterator it;
it = str.rbegin();
std::cout << *it << std::endl; // g
  • rend() — возвращает обратный итератор, установленный на позицию перед первым символом строки. Прототипы метода:
reverse_iterator rend() noexcept;
const_reverse_iterator rend() const noexcept;

Выведем первый символ строки:

std::string str("String");
std::string::reverse_iterator it;
it = str.rend();
std::cout << *(--it) << std::endl; // S
  • crbegin() — возвращает константный обратный итератор, установленный на последний символ строки. Прототип метода:
const_reverse_iterator crbegin() const noexcept;
  • crend() — возвращает константный обратный итератор, установленный на позицию перед первым символом строки. Прототип метода:
const_reverse_iterator crend() const noexcept;

С итераторами можно производить такие же операции, как и с указателями. Чтобы получить или изменить значение, на которое ссылается итератор, перед названием переменной указывается оператор * (*it). Перемещение итератора осуществляется с помощью операторов +, -, ++ и --. Кроме того, итераторы можно сравнивать с помощью операторов сравнения. В качестве примера изменим значение первого символа, а затем выведем все символы строки в прямом и обратном порядке с помощью цикла for (листинг 9.1).

Листинг 9.1. Перебор символов в строке с помощью итераторов

#include <iostream>
#include <string>

int main() {
   std::string str("String");
   std::string::iterator it1, it2;
   std::string::reverse_iterator it3, it4;
   it1 = str.begin();
   *it1 = 's'; // Изменение значения
   // Перебор символов в прямом порядке
   for (it1 = str.begin(), it2 = str.end(); it1 != it2; ++it1) {
      std::cout << *it1 << std::endl;
   }
   std::cout << "------------------" << std::endl;
   // Перебор символов в обратном порядке
   for (it3 = str.rbegin(), it4 = str.rend(); it3 != it4; ++it3) {
      std::cout << *it3 << std::endl;
   }
   return 0;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов