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());