web-dev-qa-db-ja.com

empty()ベクトルに対してbegin()== end()ですか?

空の_std::vector_ [〜#〜] v [〜#〜]V.begin() == V.end()。しかし、C++仕様には、これがalways trueであると記載されているものはありません。それは必ずしも真実ですか、それともたまたまほとんどの実装で真実ですか?

64
OldPeculier

はい、それは標準があらゆるコンテナのempty()のためにそれを要求するものです。

§23.2.1 C++ 11標準の表96は次のように述べています。

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

23.2.1一般的なコンテナ要件、具体的には表96 コンテナ要件

a.empty()boolに変換可能、動作セマンティクスa.begin() == a.end()

それから

6 begin()は、コンテナの最初の要素を参照するイテレータを返します。 end()は、コンテナの過去の値である反復子を返します。 コンテナが空の場合、begin() == end();

(エンファシス鉱山)

23
juanchopanza

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

コンテナが空の場合、end()はbegin()と同じです。

1
Jiminion

はい、それは本当です。これが proof です。そして、もちろん、空のベクターの場合はstd::distance(a.begin(), a.end()) == 0です。

0
Ivan Smirnov