【问题标题】:Using std::unique and vector.erase to remove all but last occurrence of duplicate elements使用 std::unique 和 vector.erase 删除所有重复元素,但最后一次出现
【发布时间】:2014-01-11 09:24:49
【问题描述】:

如何有效地删除稳定排序向量的所有重复项,同时保持最后一个元素而不是第一个元素的顺序?

保持第一个相当简单:

auto it = std::unique( vector.begin(), vector.end() ,[](string a, string b){ return ! (a.compare(b));});
vector.erase(it,vector.end());

但我不确定如何在保留最后一个重复元素的同时做同样的事情。 它可能可以使用反向迭代器来完成,从向量的末尾开始唯一的搜索过程,但我无法将它与擦除函数的使用结合起来。

编辑: 我通过修改排序方法找到了解决方案。现在保留第一个副本就足够了。

【问题讨论】:

  • std::unique 使用ForwardIteratorsoperator++ 来实现其目标。非常简单的实现here。但是,如果元素被称为equal,那么如果您删除了第一个或最后一个匹配项,那又有什么关系呢?
  • 我正在实现一个自定义地图类型,我只想保留同一个键的最后一个初始化元素。

标签: c++ vector stl unique erase


【解决方案1】:
auto it = std::unique( vector.rbegin(), vector.rend() ,[](string a, string b){ return ! (a.compare(b));});
vector.erase(vector.begin(),it.base());

【讨论】:

  • std::erase 不允许参数的反向迭代器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 2015-11-04
  • 2016-10-11
  • 2022-11-22
  • 1970-01-01
  • 2018-06-14
相关资源
最近更新 更多