J'ai longtemps supposé que, pour tout vider std::vector
V, V.begin() == V.end()
. Pourtant, je ne vois rien dans le C++ cahier des charges qui stipule ceci afin de toujours être vrai. Est-il nécessairement vrai ou c'est juste qu'il arrive d'être vrai sur la plupart des implémentations?
Réponses
Trop de publicités?Oui, c'est ce que la norme exige qu'il soit pour empty()
pour n'importe quel conteneur.
§ 23.2.1 Tableau 96 du C++11, dit:
+----------+---------------+----------------------+
|Expression| Return Type | Operational Semantics|
|----------|---------------|----------------------|
|a.empty() |Convertible |a.begin() == a.end() |
| |to bool | |
| | | |
+-------------------------------------------------+
23.2.1 Général contenant les exigences, spécifiquement Tableau 96 Conteneur a
a.empty()
convertiblesbool
, une sémantique opérationnellea.begin() == a.end()
Alors
6
begin()
retourne un itérateur se référant au premier élément du conteneur.end()
retourne un itérateur qui le passé est-il-la-fin de la valeur pour le conteneur. Si le conteneur est vide, alorsbegin() == end();
(l'emphase est mienne)
http://www.cplusplus.com/reference/vector/vector/end/
Si le conteneur est vide, end() est la même que begin().
Oui, c'est vrai. Voici la preuve. Et, bien sûr, std::distance(a.begin(), a.end()) == 0
pour un vecteur vide.