我正在使用std::unique
使用带有大epsilon的equals方法在浮点向量中获取合并簇。问题是需要像1这样的运行并将它们变为2
虽然我希望它将它们合并为在“相等”点上使用平均值,但将它们转换为3。
(1) ... . .... .....
(2) . . . .
(3) . . . .
如何使用C ++标准库执行此操作?
答案 0 :(得分:2)
不,没有标准的算法可以做你想要的。然而,它并不是非常复杂。我试图对迭代器做出最小的假设,所以这应该适用于任何前向输入迭代器。
#include <iostream>
template<class initer, class outiter, class predicate>
outiter average_runs(initer begin, initer end, outiter out, predicate pred) {
//quit if no range
if (begin == end)
return out;
initer endrun = begin;
do {
//find end of run
while(endrun+1 != end && pred(*endrun,*(endrun+1)))
++endrun;
//move "begin" to the middle
std::advance(begin, std::distance(begin,endrun)/2);
//output the result
*out++ = *begin;
//start next run
begin = ++endrun;
} while(endrun != end);
return out;
}
bool intclose(int l, int r)
{ return r-l <= 1;}
int main() {
int array[13] = {1,2,3,20,25,26,27,28,35,36,37,38,39};
int output[13] = {};
int* end = average_runs((int*)array, array+13, (int*)output, &intclose);
for(int* c = output; c<end; ++c)
std::cout << *c << ' ';
return 0;
}
//displays: 2 20 26 37