На этом шаге мы рассмотрим особенности обращения к элементам вектора.
В таблице 1 перечислены все операции прямого обращения к элементам векторов. Как принято в С и C++, первому элементу вектора соответствует индекс 0, а последнему - индекс size()-1. Таким образом, n-му элементу соответствует индекс n-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
На следующем шаге мы рассмотрим функции получения итераторов.