Шаг 134.
Библиотека STL.
Контейнеры STL. Операции над векторами. Обращение к элементам

    На этом шаге мы рассмотрим особенности обращения к элементам вектора.

    В таблице 1 перечислены все операции прямого обращения к элементам векторов. Как принято в С и C++, первому элементу вектора соответствует индекс 0, а последнему - индекс size()-1. Таким образом, n-му элементу соответствует индекс n-1. Для неконстантных векторов эти операции возвращают ссылку на элемент и поэтому могут использоваться для модификации элементов (при условии, что модификация не запрещена по другим причинам).

Таблица 1. Операции обращения к элементам вектора
Операция Описание
c.at(idx) Возвращает элемент с индексом idx (при недопустимом значении индекса генерируется исключение out_of_range)
c[idx] Возвращает элемент с индексом idx (без интервальной проверки!)
c.front() Возвращает первый элемент (без проверки его существования!)
c.back() Возвращает последний элемент (без проверки его существования!)

    Самый важный аспект для вызывающей стороны - наличие или отсутствие интервальной проверки при обращении к элементу. Такая проверка выполняется только функцией at(). Если индекс не входит в интервал допустимых значений, генерируется исключение out_of_range (смотри 47 шаг). Остальные функции выполняются без проверки, и интервальные ошибки приводят к непредсказуемым последствиям. Вызов оператора [], функций front() и back() для пустого контейнера всегда приводит к непредсказуемым последствиям.

  std::vector<Elem> coll;	// Пустой вектор!
  coll[5] = elem;               // ОШИБКА ВРЕМЕНИ ВЫПОЛНЕНИЯ
  std::cout << coll.front();    // ОШИБКА ВРЕМЕНИ ВЫПОЛНЕНИЯ

    Следовательно, перед вызовом оператора [] необходимо убедиться в том, что индекс имеет допустимое значение, а перед вызовом функции front() или back() - что контейнер не пуст:

  std::vector<Elem> coll;      // Пустой вектор!
  if (coll.size() > 5) {
    coll[5] = elem;  // OK
  }
  if (!coll.empty()) {
    cout << coll.front();   // OK
  }
  coll.at(5) = elem;     // Генерирует исключение out_of_range

    На следующем шаге мы рассмотрим функции получения итераторов.




Предыдущий шаг Содержание Следующий шаг