std :: unique merge

时间:2011-10-20 21:37:53

标签: c++ algorithm

我正在使用std::unique使用带有大epsilon的equals方法在浮点向量中获取合并簇。问题是需要像1这样的运行并将它们变为2 虽然我希望它将它们合并为在“相等”点上使用平均值,但将它们转换为3。

(1) ...               .      ....    .....
(2) .                 .      .       .
(3)  .                .       .        .

如何使用C ++标准库执行此操作?

1 个答案:

答案 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