我知道这个问题已经被问了很多,但我找不到从矢量中删除重复成员(类型double
)的最佳(最有效)方法,而维护1份和原始矢量的顺序。
答案 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将矢量与链表进行比较。)