Ist begin () == end () für einen leeren () Vektor?

71

Ich habe lange angenommen, dass für jedes leere std::vector V , V.begin() == V.end(). Ich sehe jedoch nichts in der C ++ - Spezifikation, was besagt, dass dies immer wahr ist. Ist es notwendigerweise wahr oder ist es bei den meisten Implementierungen einfach wahr?

OldPeculier
quelle
5
Ich bin mir ziemlich sicher, dass dies gefragt wurde, obwohl ich Probleme habe, es zu finden, und ich bin mir ziemlich sicher, dass sie gleich sind.
chris
3
Wenn es nicht wahr wäre, würde es alle gängigen Muster für die Iteration auf einem Vektor ungültig machen ...;)
Karoly Horvath
Verwandte Frage: Wenn beide begin()und end()zuerst in Zeiger umgewandelt werden, gilt die Gleichheit immer noch? Ich mache mir Sorgen, dass auch das Casting undefiniert ist?
Aaron McDaid

Antworten:

92

Ja, das verlangt der Standard empty()für jeden Container.

§ 23.2.1 In Tabelle 96 des C ++ 11-Standards heißt es:

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

23.2.1 Allgemeine Behälter Anforderungen , insbesondere Tabelle 96 Container Anforderungen haben

a.empty()konvertierbar zu bool, operative Semantika.begin() == a.end()

Dann

6 begin()gibt einen Iterator zurück, der auf das erste Element im Container verweist. end()Gibt einen Iterator zurück, der der Endwert für den Container ist. Wenn der Container leer ist, dannbegin() == end();

(Hervorhebung von mir)

Juanchopanza
quelle
0

Ja, das ist wahr. Hier ist der Beweis . Und natürlich std::distance(a.begin(), a.end()) == 0für einen leeren Vektor.

Ivan Smirnov
quelle
14
Der Beweis wäre ein Standardzitat, nicht wie eine Referenzstelle.
John Dibling