web-dev-qa-db-fra.com

Est-ce que begin () == end () pour tout vecteur vide ()?

Je suppose depuis longtemps que pour tout std::vector V , V.begin() == V.end() vide. Pourtant, je ne vois rien dans la spécification C++ qui indique ceci pour toujours être vrai. Est-ce nécessairement vrai ou est-ce juste vrai sur la plupart des implémentations?

64
OldPeculier

Oui, c'est ce que la norme exige pour empty() pour n'importe quel conteneur.

§ 23.2.1 Le tableau 96 de la norme C++ 11 dit:

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

23.2.1 Exigences générales relatives aux conteneurs, en particulier le tableau 96 Exigences relatives aux conteneurs a

a.empty() convertible en bool, sémantique opérationnelle a.begin() == a.end()

Ensuite

6 begin() renvoie un itérateur faisant référence au premier élément du conteneur. end() renvoie un itérateur qui est la valeur de fin de fin pour le conteneur. Si le conteneur est vide, alors begin() == end();

(c'est moi qui souligne)

23
juanchopanza

http://www.cplusplus.com/reference/vector/vector/end/

Si le conteneur est vide, end () est identique à begin ().

1
Jiminion

Oui c'est vrai. Voici le preuve . Et, bien sûr, std::distance(a.begin(), a.end()) == 0 pour un vecteur vide.

0
Ivan Smirnov