いいえ、あなたが望むことができる標準的なアルゴリズムはありません。しかし、それは信じられないほど複雑ではありません。私はイテレーターについての仮定を最小限に抑えようとしたので、これはすべてのフォワード入力イテレーターで機能するはずです。
#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
データの形式は何ですか。単に 'std :: vector'にすることはできません。そうしないと、位置が失われます。私があなたを誤解しない限り。 –
@MooingDuck:値は位置です。最初のものは1,2,3,20,25,26,27,28,35,36,37,38,39のようなものです。 – Dani
「実行中」は常に連続していますか? –