如何有效地添加和删除矢量值C ++

时间:2016-12-13 12:53:08

标签: c++ matrix vector

我正在尝试有效地计算向量的平均值。 我有一个矩阵(向量矢量),其中:

行:我要回去的日子(250)

专栏:我正在计算的事物类型(10,000种不同的东西)

目前我正在使用.push_back(),它基本上遍历每列中的每一行,然后我使用erase()来删除最后一个值。由于此方法遍历所有值,因此我的代码非常慢。

我正在考虑一个与替换相关联的方法,但是我很难实现这个想法,因为所有的值都有一个顺序(即我需要删除旧的值,我添加/替换的值将是最新的)。

以下是我的代码。 任何有关正确方向的解决方案或指南的想法都将受到高度赞赏。

//declaration
vector <vector<float> > vectorOne;
//initialization
vectorOne(250, vector<float>(10000, 0)),

//This is the slow method
vectorOne[column].push_back(1);//add newest value
vectorOne[column].erase(vectorOne[column].begin() + 0); //remove latest value

2 个答案:

答案 0 :(得分:1)

您可能需要不同的数据结构。

问题听起来像一个队列。你添加到最后并从前面采取。有了真正的队列,每个人都会洗牌。使用计算机队列,我们​​可以使用循环缓冲区(您需要能够在最大队列长度上获得合理的限制)。

我建议首先在普通C数组上实现自己的,然后在理解了原理时使用STL版本。

答案 1 :(得分:0)

如果您事先知道数据的大小,可以使用std::array并取消任何重新分配。 (如果您没有使用引入std::array的C ++ 11,那么您可以使用 - 而这是我唯一一次建议这样做 - 相反内置数组。)

您的代码格式为:

std::array<std::array<yourdata,10000>250> rollingBuffer;
or
yourdata[250][10000] rollingBuffer;

for(int i = 0; i < CycleLimit; i++){
  for(auto row : rollingBuffer){
    for(size_t col = 0; col < row.size(); col++) {
      row[col] = getNextData(col);
      double av;
      for(const auto& r : rollingBuffer){
        av += r[col];
      }
      sendAverage(av/yourData.size());
    }
  }
}

也就是说,它遍历行,将新数据输入到元素中,对该列中的元素求和并将其记录(到另一个2D数组中??),它们移动到下一列。当它到达行的末尾时,它会在下一行再次开始。当它到达行的末尾时,它会再次启动,直到它循环通过您想要的多次迭代。

但它是四个嵌套循环。可能有更好的方法......但是,没有重新分配。与vectordeque进行比较会很有意思。