在保持顺序的同时从向量中删除重复的成员

时间:2013-10-22 10:09:31

标签: c++

我知道这个问题已经被问了很多,但我找不到从矢量中删除重复成员(类型double)的最佳(最有效)方法,而维护1份原始矢量的顺序

2 个答案:

答案 0 :(得分:3)

如果您的数据不是double,只需通过unordered_set通过remove_if - erase成语跟踪您已经看到的内容即可。

但是,在检查相等性时,

double是个坏消息:您认为可能产生相同值的两个派生可能会产生不同的结果。 set允许查找附近的值。只需使用加号减去epsilon而不是equal_range的{​​{1}}来查看find之前是否存在与您的大致相同的其他值,并使用相同的vector {{ 1}}成语。

remove erase成语如下:

remove

在C ++ 03中无法内联完成。

上面的lambda将按顺序为每个元素调用,就像循环体一样。

答案 1 :(得分:1)

如果你必须/希望使用矢量*那么最简单的方法就是在插入时捕获重复项 - 如果要插入的点已经存在,请将其加入。

真正大型集合的另一种方法是在每N次插入后进行排序并搜索重复项,其中N是在进行排序和搜索重复项之前要等待的完美插入次数。 (计算N留给读者练习。)

您的方法以及相关的N值取决于元素的数量,数组的更改频率,检查内容的频率以及重复发生的可能性。

(*显然,矢量很好,因为它们的缺点在于现代计算机倾向于如此努力地踢它们并不重要,并且线性搜索速度非常快。至少我认为这就是Bjarn的说法here将矢量与链表进行比较。)