2013-10-22 73 views
1

我知道这个问题已经被问了很多,但我无法找到最好的(最有效)的方式来删除载体复制的成员(类型double),而保持1份原始矢量的顺序从载体删除重复的成员,同时维持秩序

+6

请告诉我们你试过了什么? –

+0

我有一个点(定义类型)的向量,其中可能有一些点已在过程中插入两次。我想删除/删除复制的点(只有第二个副本,我的意思是我想要第一个副本)。也想保持原始矢量的顺序。 –

+0

非常感谢@Johnsyweb它是最有效的方式吗? –

回答

3

如果你的数据不是double S,只是做与你已经通过remove_if看到一个unordered_set保持跟踪一通 - erase成语会工作。然而,当检查平等时,坏消息是:你可能认为应该产生相同的值的两个派生可能会产生不同的结果。 A set将允许查找附近的值。只需使用equal_range加正负号ε而不是find来查看在vector之前是否存在与您之前的值近似相等的其他值,并使用相同的removeerase惯用法。

removeerase成语的样子:

vec.erase(std::remove_if(vec.begin(), vec.end(), [&](double x)->bool{ 
    // return true if you want to remove the double x 
}, vec.end()); 
在C++ 03

不能在线完成。

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

1

如果您必须/希望使用矢量*,则可能最容易在插入时捕获重复项 - 如果要插入的点已经存在,请将其装箱。

对于一个非常大的集合的另一种方法是在每次N次插入之后进行排序和重复搜索,其中N是在对重复进行排序和搜索之前等待的完美插入次数。 (计算N作为读者的练习。)

您的方法和N的值(如果相关)取决于元素数量,数组更改频率,检查内容的频率以及重复发生的可能性。 (*显然,矢量是伟大的,因为它们的缺点在于现代计算机倾向于踢屁股这么辛苦并不重要,而且用线性搜索来快速起效。至少我认为这就是Bjarn的说法here比较矢量。到链表)