我知道这个问题已经被问了很多,但我找不到double
从 vector 中删除重复成员(type)的最佳(最有效)方法,同时保持原始 vector 的 1 个副本和顺序。
2 回答
如果您的数据不是double
s,则只需通过-成语unordered_set
跟踪您已经看到的内容进行传递即可。remove_if
erase
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 将按顺序为每个元素调用,就像循环体一样。
如果您必须/希望使用向量*,那么在插入时捕获重复项可能是最容易的 - 如果要插入的点已经存在,请将其装箱。
对于非常大的集合,另一种方法是在每 N 次插入后进行排序并搜索重复项,其中 N 是在进行排序和搜索重复项之前等待的完美插入次数。(计算 N 留给读者作为练习。)
您的方法以及 N 的值(如果相关)取决于元素的数量、数组更改的频率、检查内容的频率以及发生重复的可能性。
(*显然,向量很棒,因为它们的缺点在于现代计算机往往会如此努力地踢屁股,这并不重要,并且线性搜索速度非常快。至少我认为这就是 Bjarn在这里将向量与链表进行比较时所说的.)