0
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()在返回行中那样使用它吗?

4

1 回答 1

3

从 C++11 标准(n3337 草案)的第23.3.6.3 节矢量容量第 9 条(粗体文本是我的重点,因为在发布的代码中sz <= size()就是这样):

void resize(size_type sz);

效果:如果sz <= size(),相当于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评论),因为代码的意图更清晰。

于 2013-07-02T15:04:33.583 回答