是否有任何stl算法适用于2倍循环?

时间:2013-07-28 21:47:23

标签: c++ for-loop stl

我有一个算法可以一次拾取并总结二维数组中的特定数据,这是通过以下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倍。我在想是否stl算法会帮助这个案例,但stl对我来说太抽象了,我不知道如何在2-fold循环中使用它。任何建议或想法都会受到欢迎。


根据我在网上找到的其他帖子和信息,我正在尝试使用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&amp; n)上编译,会出现许多错误消息。其次,即使它工作也不会将结果存储到正确的位置。对于第一个for_each,我的目的是枚举每个索引,以便计算相应的和并将总和存储为结果数组的对应元素。

1 个答案:

答案 0 :(得分:0)

首先,STL不会给你带来神奇的性能优势。

已经有一个std::accumulate,比构建自己的更容易。但可能不会更快。同样,std::generate_n会调用生成器(例如&rand)N次。

在致电c之前,首先填充index.push_back(c);。推送空向量可能更便宜,并设置std::vector<int>& c = index.back()