このWebサイトは、ベクトルをクリアすると容量が変わる可能性があることを意味します。
http://en.cppreference.com/w/cpp/container/vector/clear
多くの実装では、clear()の呼び出し後に割り当てられたメモリを解放せず、ベクターのcapacity()を事実上変更しません。
しかし、@ JamesKanzeによると、これは間違っており、クリアが容量を変更しないという標準的な義務があります。
規格は何と言っていますか?
表示している標準のバージョンに応じて、clear
はerase(begin(), end())
、または(C++ 11の場合)と同等のものとして定義されます。
"aのすべての要素を破棄します。aの要素を参照するすべての参照、ポインタ、およびイテレータを無効にし、過去のイテレータを無効にする場合があります。"
どちらの場合も、容量を変更することはできません。次のコードは、標準によって安全であることが保証されています。
std::vector<int> v;
for (int i = 0; i != 5; ++ i) {
v.Push_back(i);
}
assert(v.capacity() >= 5);
v.clear();
assert(v.capacity() >= 5);
v.Push_back(10);
v.Push_back(11);
std::vector<int>::iterator i = v.begin() + 1;
v.Push_back(12);
v.Push_back(13);
*i = 42; // i must still be valid, because none of
// the Push_back would have required an
// increase of capacity
(C++ 11での文言の変更の理由:委員会は、MoveAssignable
に関してclear
を要求することを望んでいませんでした。これは、erase
に関して定義された場合に当てはまります。)