C++ 如何高效地删除向量中的重复元素

C++ 如何高效地删除向量中的重复元素,c++,C++,我有 如果您可以对容器中的元素进行排序,那么简单且相对有效的解决方案将是: ex : In data; abba, abraham, edie, Abba, edie After operation; abba, abraham, edie, Abba 我不确定有没有真正好的方法。 我要做的是排序(在不同的数组中,如果您需要原稿的话),然后运行它。“set”不允许重复。您可以使用它来筛选重复项 创建一个集合 将所有用户名添加到集合 创

我有


如果您可以对容器中的元素进行排序,那么简单且相对有效的解决方案将是:

ex :
    In data;
           abba, abraham, edie, Abba, edie
    After operation;
           abba, abraham, edie, Abba

我不确定有没有真正好的方法。 我要做的是排序(在不同的数组中,如果您需要原稿的话),然后运行它。

“set”不允许重复。您可以使用它来筛选重复项

  • 创建一个集合
  • 将所有用户名添加到集合
  • 创建一个新的向量
  • 将集合中的所有元素添加到向量

  • 如果您真的需要高效地执行此操作,那么应该首先进行就地排序,然后自己检查容器,而不是使用std::unique,将唯一项提取到新向量中,最后进行交换


    我刚刚检查了std::unique的源代码,它在找到一个副本时会做很多移动,移动会影响vector的性能。

    但这不会保留
    vector
    中的顺序。是的,不会。如果你想保持秩序,复杂性就会增加。基本上,为现有向量中的每个项创建一个新向量{如果它存在于集合中,则不执行任何操作,否则将其添加到集合并添加到目标向量}在这里使用
    stable\u sort
    不是更好吗?@Naveen:为什么?只有当等价元素的相对位置重要时,才需要一个稳定的排序,而如果只是删除重复项,这显然无关紧要。除非您特别想保留等价组的第一个匹配项。元素的相对顺序重要吗?也就是说,您是否关心在操作过程中被洗牌的元素,还是希望以完全相同的顺序获得序列?
    std::unique
    应该只需要对排序序列进行一次遍历。你所说的“当找到一个副本时,它将进行大量移动”是什么意思?这是一个单一的过程,但每次它找到一个副本时,它都需要将其移动到最后。0 1 1 2 2 3 -> 0 1 2 2 3 1 -> 0 1 2 3 1 2.
    ex :
        In data;
               abba, abraham, edie, Abba, edie
        After operation;
               abba, abraham, edie, Abba
    
    std::sort(data.begin(), data.end());
    data.erase(std::unique(data.begin(), data.end()), data.end());