54

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

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

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

しかし、@JamesKanzeによると、これは間違っており、クリアする標準の義務は容量を変更しません。

基準は何と言っていますか?

4

1 に答える 1

55

参照している標準のバージョンに応じて、 は, または (C++11 の場合) にclear相当するものとして定義され ます。終わりを過ぎた反復子を無効にする可能性があります。」erase(begin(), end())

どちらの場合も、容量を変更することはできません。次のコードは、標準によって安全が保証されています。

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

MoveAssignable(C++11 での文言の変更の理由: 委員会はforを必要としたくなかったためclear、 で定義されていた場合はそうでしeraseた。)

于 2013-08-27T14:14:13.780 に答える