【问题标题】:Setting second dimension of vector of vectors to zero (C++)将向量的向量的第二维设置为零(C++)
【发布时间】:2012-02-24 08:51:30
【问题描述】:

有一个向量的向量:

std::vector <std::vector <float> > VoV;
VoV.resize(num);   // num is determined at run-time
for (int i=0; i<num; ++i) {

    VoV[i].resize(3);   // initializing to zero
}

我想在一些操作后将所有三个元素设置为零。我的意思是,我知道最初它们会被设置为零但是,它们的值会在一段时间后改变,我想再次将它们设置为零。那么,下面的说法正确吗?效率高吗?有没有更好的方法?

std::fill(VoV.begin(), VoV.end(), 0.f);

【问题讨论】:

    标签: c++ stdvector multidimensional-array


    【解决方案1】:

    您可以通过多种方式将所有数据设置为零。最简单的可能是:

    VoV = std::vector<std::vector<float> >(num, std::vector<float>(3, 0.));
    

    或者,

    std::fill(VoV.begin(), VoV.end(), std::vector<float>(3, 0.));
    

    或者,

    for(std::vector<float>& v : VoV)
      std::fill(v.begin(), v.end(), 0.);
    

    甚至:

    for(auto& v : Vov)
      for(auto& f : v)
        f = 0;
    

    注意:我没有测试过这些。

    【讨论】:

    • 值得注意的是,第一个需要重新分配两个维度中的所有元素。
    • 注明。第二个需要重新分配分量向量。第三和第四都不需要任何重新分配。
    • 那么,第 3 和第 4 方法应该更快?
    • @Shibli 3rd 和 4rth 跑得更快是我天真的信念。与任何与速度有关的事情一样,如果对您很重要,请自行测试。
    • @Rob:第三个给,reference variable 'v' requires initializer
    【解决方案2】:

    不。你有向量的向量,所以要填充它,你需要一个向量。除了 Rob 的回答之外,为了获得更好的性能,请循环​​执行(保留您的语法/样式):

    for (int i=0; i<num; ++i) {
        VoV[i].fill(VoV[i].begin(), VoV[i].end(), 0.f);   // initializing to zero
    }
    

    在这种情况下,您将避免重复使用现有向量进行内存分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 2011-05-30
      • 2020-12-01
      • 1970-01-01
      相关资源
      最近更新 更多