たとえば、a
次のようなデータを含むサイズ 10 の配列があります。
0.0
0.01
0.02
0.03
5.04
6.05
7.06
13.07
20.08
22.09
ステップ固定が 5 の場合、予想されるデータ範囲は次のとおりです。
start end
0.0 0.03
5.04 7.06
13.07 13.07
20.08 22.09
C/C++ でこのように実装するための提案はありますか? プログラミング方法は?
単純なループでそれを行うことができます:
#include <stdio.h>
int main(void)
{
float f, a[] = {0.0, 0.01, 0.02, 0.03, 5.04, 6.05, 7.06, 13.07, 20.08, 22.09};
size_t i;
#define N (sizeof a / sizeof a[0])
for (f = a[0], i = 0; i <= N; i++) {
if (i == N || a[i] > f + 5.0) {
printf("%f %f\n", f, a[i - 1]);
if (i != N) f = a[i];
}
}
return 0;
}
#include <iostream>
using namespace std;
int fun(double* arr, int n, double* res)
{
int start = 0;
int end = 0;
int len = 0;
for(int i = start; i < n; ++i)
{
if(arr[i]- arr[end] < 5)
{
end = i;
}
else
{
res[len++] = arr[start];
res[len++] = arr[end];
start = end = i;
}
}
res[len++] = arr[start];
res[len++] = arr[end];
return len;
}
int main()
{
double t[] = {
0.0,
0.01,
0.02,
0.03,
5.04,
6.05,
7.06,
13.07,
20.08,
22.09
};
int n = sizeof(t) / sizeof(*t);
double *res = new double[n];
int k = fun(t, n, res);
for(int j = 0; j < k; j += 2)
cout<<res[j]<<" "<<res[j+1]<<endl;
}
少し遅くなりましたが、ここでは C++ の非常にコンパクトな実装を示します。
template <typename T>
std::vector<std::pair<T, T>> generate_pairs(T *first, T *last)
{
std::vector<std::pair<T, T>> result(std::distance(first, last) / 2);
std::generate(std::begin(result), std::end(result), [&first] { return std::make_pair(*first++, *first++); });
return result;
}
int main(int argc, char *argv[])
{
double arr[] = { 0.0, 0.01, 0.02, 0.03, 5.04, 6.05, 7.06, 13.07, 20.08, 22.09 };
auto v = generate_pairs(std::begin(arr), std::end(arr));
for (const auto &p : v)
std::cout << "(" << p.first << ", " << p.second << ")" << std::endl;
return 0;
}