为什么在执行vector <t> :: erase(...)时迭代器会部分无效?

时间:2019-03-31 21:41:05

标签: c++

当我在向量上执行.erase(...)时,从删除第一个元素开始和之后的迭代器将无效。但是因为之前的迭代器没有失效,所以不会发生任何重新分配。即使缩小向量也是如此。因此,我想知道为什么标准强制要求以第一个被擦除的元素开头的迭代器无效。他们可以简单地在没有任何实现限制的情况下,适度地引用移位的元素。

那背后的技术原因是什么?

[EDIT]:这不是一个重复的问题,因为我在询问技术原因。如果我用自己的代码像.erase()一样做...

template<typename T>
void vector_erase( vector<T> &v, typename vector<T>::iterator first, typename 
vector<T>::iterator last )
{
    typename vector<T>::iterator shiftOld,
                                 shiftNew;
    for( shiftOld = last, shiftNew = first; shiftOld != v.end(); ++shiftOld, ++shiftNew )
        *shiftNew = move( *shiftOld );
    v.resize( shiftNew - v.begin() );
}

...迭代器将一直有效,直到我剪切矢量为止。 vecor :: erase(...)的作用相同,因为据证明它确实使用了assigment-operator。

0 个答案:

没有答案