web-dev-qa-db-ja.com

ベクトルでclearを呼び出すと、容量がどのように変化するかについて、標準は何と言っていますか?

このWebサイトは、ベクトルをクリアすると容量が変わる可能性があることを意味します。

http://en.cppreference.com/w/cpp/container/vector/clear

多くの実装では、clear()の呼び出し後に割り当てられたメモリを解放せず、ベクターのcapacity()を事実上変更しません。

しかし、@ JamesKanzeによると、これは間違っており、クリアが容量を変更しないという標準的な義務があります。

規格は何と言っていますか?

45
Neil Kirk

表示している標準のバージョンに応じて、clearerase(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に関して定義された場合に当てはまります。)

44
James Kanze