Jeff Wofford
Jeff Wofford

Reputation: 11577

Is begin() == end() for any empty() vector?

I have long assumed that for any empty std::vector V, V.begin() == V.end(). Yet I see nothing in the C++ specification that states this to always be true. Is it necessarily true or does it just happen to be true on most implementations?

Upvotes: 88

Views: 39258

Answers (4)

Rapptz
Rapptz

Reputation: 21317

Yes, that's what the standard requires it to be for empty() for any container.

§ 23.2.1 Table 96 of the C++11 standard says:

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

Upvotes: 113

juanchopanza
juanchopanza

Reputation: 227468

23.2.1 General container requirements, specifically Table 96 Container Requirements has

a.empty() convertible to bool, operational semantics a.begin() == a.end()

Then

6 begin() returns an iterator referring to the first element in the container. end() returns an iterator which is the past-the-end value for the container. If the container is empty, then begin() == end();

(emphasis mine)

Upvotes: 30

Jiminion
Jiminion

Reputation: 5168

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

If the container is empty, end() is the same as begin().

Upvotes: -1

Ivan Smirnov
Ivan Smirnov

Reputation: 4435

Yes, that is true. Here is the proof. And, of course, std::distance(a.begin(), a.end()) == 0 for an empty vector.

Upvotes: -1

Related Questions