1

我知道这个问题已经被问了很多,但我找不到double从 vector 中删除重复成员(type)的最佳(最有效)方法,同时保持原始 vector 的 1 个副本顺序

4

2 回答 2

3

如果您的数据不是doubles,则只需通过-成语unordered_set跟踪您已经看到的内容进行传递即可。remove_iferase

double但是,在检查相等性时,s 是个坏消息:您可能认为应该产生相同值的两个推导可能会产生不同的结果。Aset将允许查找附近的值。只需使用equal_range加减 epsilon 而不是find查看在 中是否有另一个值与您之前的值大致相等vector,并使用相同的remove erase习语。

remove erase成语看起来像:

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 将按顺序为每个元素调用,就像循环体一样。

于 2013-10-22T12:35:47.013 回答
1

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

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

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

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

于 2013-10-22T10:39:35.187 回答