template <typename T>
int eliminate_duplicate(vector<T> &A) {
sort(A.begin(), A.end()); // makes identical elements become neighbors
auto it = unique(A.begin(), A.end()); // removes neighboring duplicates
A.resize(it - A.cbegin()); // truncates the unnecessary trailing part
return it - A.cbegin(); // Question> Is this line valid?
}最后一行有效吗?
我担心的是:在调用resize之后,迭代器it将指向一个无效的位置,所以我们仍然可以在返回行中将其用作it - A.cbegin()吗?
发布于 2013-07-02 23:04:34
摘自C++11标准(草案n3337)的第23.3.6.3节向量容量,第9条(粗体文本是我的重点,因为在发布的代码中,sz <= size()为真):
void resize(size_type sz);擦除效果:If sz <=
(),相当于erase(begin() + sz,end());。如果size() < sz,则将sz - size()值初始化的元素追加到序列中。
从23.3.6.5节向量修饰符第3条:
iterator erase(const_iterator position);
iterator erase(const_iterator first, const_iterator last);效果:在擦除点或之后使迭代器和引用无效。
begin() + sz等于it,因此it无效。
要进行更正,只需返回A.size() (如果调用者确实需要它,因为该信息无论如何都可以从A获得)。建议使用A.erase(it, A.end()); (正如juanchopanza所评论的),因为代码的意图更清晰。
https://stackoverflow.com/questions/17428375
复制相似问题