【问题标题】:How to remove duplicated elements from vector? [duplicate]如何从向量中删除重复的元素? [复制]
【发布时间】:2014-02-24 08:29:54
【问题描述】:

因此我有std::vector<type>.

类类型没有operator<,但有operator==。 因此,我无法使用std::unique 对我的向量进行排序。

如何从向量中删除重复的元素?

【问题讨论】:

  • 如果不订购,您几乎没有机会有效地做到这一点。未排序(它必须没有排序功能)会将您直接扔到 O(N^2) - 土地。
  • @WhozCraig:不一定,如果你能得到一个完美的哈希值,你可以在 O(N) 内完成。
  • @MatthieuM。如果您可以提供完美的哈希,那么这首先在无序向量中而不是std::unordered_set 中做了什么?鉴于我们必须处理的唯一事情是OP提供的信息,我的主张是基于我的主张。如果他们有一个合理的散列(完美与否),那么这个问题中的 X 是“为什么我为此使用错误的容器?”显然我不能说给定这样的散列它是行不通的;显然会的。
  • 其实,在这种情况下,我应该找出我的容器是否包含重复的元素,并在删除它们之后。
  • @EduardRostomyan 因为这个问题已经很接近了,所以我无法提供一个权宜之计的解决方案。鉴于您提出的问题的限制,this may do what you want。它应该适用于给定的限制,仅使用operator == 进行相等比较,尽管我承认我只在一个简单的标量类型上测试了它。总之,希望对你有所帮助。祝你好运,先生。

标签: c++ stdvector


【解决方案1】:

我认为最好的选择是编写一些二进制谓词用于向量的排序,然后使用std::unique。请记住,谓词必须是可传递的!

如果这不是一个选项,您只能使用二次算法:

std::vector<type> a
std::vector<type> result;
for (unsigned i = 0; i < a.size(); ++i) {
  bool repeated = false;
  for (int j = 0; j < i; ++j) {
    if (a[j] == a[i]) {
      repeated = true;
      break;
    }
  }
  if (!repeated) {
    result.push_back(a[i]);
  }
}

// result stores the unique elements.

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    相关资源
    最近更新 更多