首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::unique返回的迭代器的用法

问std::unique返回的迭代器的用法
EN

Stack Overflow用户
提问于 2013-07-02 22:33:07
回答 1查看 144关注 0票数 0
代码语言:javascript
复制
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()吗?

EN

回答 1

Stack Overflow用户

发布于 2013-07-02 23:04:34

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

代码语言:javascript
复制
void resize(size_type sz);

擦除效果:If sz <=

(),相当于erase(begin() + sz,end());。如果size() < sz,则将sz - size()值初始化的元素追加到序列中。

从23.3.6.5节向量修饰符第3条:

代码语言:javascript
复制
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所评论的),因为代码的意图更清晰。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17428375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档