11

なぜこのコードは

#include <algorithm>
#include <iterator>
#include <vector>

int main()
{
    std::vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.reserve(v.size() * 2);  // Reserve enough space to keep iterators valid
    std::copy(v.begin(), v.end(), std::back_inserter(v));
    return 0;
}

デバッグ アサーション エラー、Expression: vector iterators incompatible (Visual C++ 2008)を教えてください。

4

1 に答える 1

14

要素に対応する反復子は、ベクトルを再割り当てする必要がある場合にのみ無効化されるため、reserve回避されます。

ただし、v.end()有効なままではありません。

規格の説明push_backinsert保証

新しいサイズが古い容量より大きい場合、再割り当てが発生します。再割り当てが発生しない場合、挿入ポイントの前のすべての反復子と参照は有効なままです。

v.end()「挿入ポイントの前」ではありません。

于 2013-04-06T20:26:41.767 に答える