Is begin() == end() для любого пустого() вектора?

Я давно предполагал, что для любого пустого std::vector V, V.begin() == V.end(). Тем не менее я не вижу ничего в спецификации на С++, которая утверждает, что это всегда верно. Это обязательно верно или действительно ли это справедливо для большинства реализаций?

Ответ 1

Да, это то, что стандарт требует от него для empty() для любого контейнера.

§ 23.2.1 В таблице 96 стандарта С++ 11 говорится:

 +----------+---------------+----------------------+
 |Expression|  Return Type  | Operational Semantics|
 |----------|---------------|----------------------|
 |a.empty() |Convertible    |a.begin() == a.end()  |
 |          |to bool        |                      |
 |          |               |                      |
 +-------------------------------------------------+

Ответ 2

23.2.1 Общие требования к контейнеру, в частности таблица 96 Требования к контейнеру имеют

a.empty() конвертируется в bool, операционная семантика a.begin() == a.end()

Тогда

6 begin() возвращает итератор, ссылающийся на первый элемент в контейнере. end() возвращает итератор, который это значение конца для контейнера. Если контейнер пуст, то begin() == end();

(акцент мой)

Ответ 4

Да, это правда. Вот доказательство. И, конечно, std::distance(a.begin(), a.end()) == 0 для пустого вектора.