the*_*max 4 c++ containers stl
有没有一种方便的方法从一个值在一定间隔内的向量(或另一个stl容器)中删除项目?
例如:我有一个带浮点值的向量
1.1 1.3 2.2 3.2 4.1 5.2 5.1 1.1 8.0 2.1
Run Code Online (Sandbox Code Playgroud)
并且delta为0.2,这应该导致以下结果
1.1 2.2 3.2 4.1 5.1 8.0
Run Code Online (Sandbox Code Playgroud)
从而删除增量内的所有"重复"项目,并保留其中一个值在该范围内.可以假设这些值是"聚集的",其中这些值之间的差异大于3*delta.只应保留群集的一个值(平均值),应删除群集中的所有其他值.
当然,可以使用嵌套循环进行迭代,但这看起来相当复杂,因为迭代器的变化,所以我想到了一种更方便的方法.我找到了remove_if,但是这个函数不能"比较".
谢谢你的建议.
您可以使用std::unique谓词:
template <typename It, typename Predicate>
It unique(It first, It last, Predicate pred);
Run Code Online (Sandbox Code Playgroud)
最常用的形式不std::unique带谓词,只是从序列中删除重复项.但是你可以编写一个实现你的过滤器(在你的情况下,使用间隙比较两个值)并设置.就像是:
bool CompareWithGap(double a, double b)
{
return abs(a - b) <= 0.2;
}
Run Code Online (Sandbox Code Playgroud)
并用它来打电话std::unique:
auto it = std::unique(v.begin(), v.end(), CompareWithGap);
Run Code Online (Sandbox Code Playgroud)
v你的载体(或任何其他序列)在哪里.
编辑:忘记提及您需要在使用前对序列进行排序std::unique.如果这不是一个选项,您必须编写自己的算法.
第二次编辑:完成后,正如Christian Rau在评论中指出的那样,您现在可以使用其中的erase方法删除从序列中删除的项目:
v.erase(it, v.end());
Run Code Online (Sandbox Code Playgroud)
你的问题实际上非常复杂,因为"范围内的一个值"没有明确定义.例如给定
1.1 1.2 1.3
你想保留哪些?大概是第一个,即1.1.好了,现在怎么样
0.9 1.1 1.3
遵循第一条规则,我们保持0.9和1.3,但我们可以保持1.1而不是.我认为的问题是0.9和1.3'重复'还是没有?我认为你没有足够好地定义这一点.
那么这个案子怎么样,1.1 1.2 1.3 1.4 1.5 1.6?所有值都在另一个值的0.2之内,但并非所有值都在每个其他值的0.2之内.那么它们都是重复的吗?或者你需要拆分它们吗?如果是这样,他们应该如何分开,或许选择1.1和1.4?
所以我想在你更准确地定义问题之前,你不可能编写代码或帮助我们.
您可能想要查看不相交的数据结构.根据您的具体操作,它可能是解决此问题的最有效方法.
| 归档时间: |
|
| 查看次数: |
676 次 |
| 最近记录: |