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?


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        |                      |
 |          |               |                      |
 +-------------------------------------------------+

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)



0

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


14
Der Beweis wäre ein Standardzitat, nicht wie eine Referenzstelle.
John Dibling
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.