我有一个算法可以一次从二维数组中提取和总结特定数据,这是通过以下 2 倍循环完成的
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <vector>
#include <cmath>
using namespace std;
int main(int argc, char* argv[])
{
double data[2000][200];
double result[200];
int len[200];
vector< vector<int> > index;
srand (time(NULL));
// initialize data here
for (int i=0; i<2000; i++) for (int j=0; j<200; j++) data[i][j] = rand();
// each index element contains some indices for some elements in data, each index elements might have different length
// len[i] tell the size of vector at index[i]
for (int i=0; i<200; i++)
{
vector<int> c;
len[i] = (int)(rand()%100 + 1);
c.reserve(len[i]);
for (int j=0; j<len[i]; j++)
{
int coord= (int)(rand()%(200*2000));
c.push_back(coord);
}
index.push_back(c);
}
for (int i=0; i<200; i++)
{
double acc=0.0;
for (int j=0; j<index[i].size(); j++) acc += *(&data[0][0] + (int)(index[i][j]));
result[i] = acc;
}
return 0;
}
由于该算法将应用于一个大数组,并且 2-fold 可能会在相当长的时间内执行。我在想 stl 算法是否会帮助这种情况,但 stl 对我来说太抽象了,我不知道如何在 2 倍循环中使用它。任何建议或想法都更受欢迎。
根据我在网上找到的其他帖子和信息,我正在尝试使用 for_each 来解决问题
double sum=0.0;
void sumElements(const int &n)
{
sum += *(&data[0][0] + n);
}
void addVector(const vector<int>& coords)
{
for_each( coords.begin(), coords.end(), sumElements)
}
for_each( index.begin(), index.end(), addVector);
但是这段代码有两个问题。首先,它不能在 void sumElements(const int &n) 上编译,出现许多错误消息。其次,即使它有效,它也不会将结果存储到正确的位置。对于第一个for_each,我的意图是枚举每个索引,因此计算相应的总和并将总和存储为results数组的对应元素。