【问题标题】:C++: Declare a vector inside or outside of a loopC++:在循环内部或外部声明一个向量
【发布时间】:2018-04-01 05:58:25
【问题描述】:

我想循环几个随机组合。目前,我在循环外定义了一个向量 1n 的向量 v,在循环内随机播放 v 并在循环内定义一个新向量 combination

int k = 50;
int n = 100;
int sampleSize=100;
std::vector<int> v(n);
//std::vector<int> combination(k); //Would it be better to declare here?
std::iota(v.begin(), v.end(), 0);
unsigned seed = 42;

for (int i=0; i<sampleSize; i++) {
    std::shuffle (v.begin(), v.end(), std::default_random_engine(seed));
    std::vector<int> combination(v.begin(), v.begin() + k);
};

在 for 循环的每次迭代中我都再次定义 combination 对我来说似乎很奇怪。在 for 循环之外声明 combination 然后在每次迭代中为其分配新值是否有意义?如果是这样,将这些新值分配给combination 的好方法是什么?到目前为止,我只使用push_back() 将新值附加到向量。

【问题讨论】:

  • 最好在循环外声明向量,因为在循环的每次迭代中都会调用向量的析构函数。
  • 你不显示所有代码,但你不能在循环中使用v本身吗?

标签: c++ loops for-loop vector redeclare


【解决方案1】:

除了push_back之外,还有多种方法可以在向量中赋值:

  • [] 运算符使您可以对向量的单个元素进行读/写访问,因此您可以执行v[5] = 10。将其放入 for 循环中,根据循环的索引访问元素。
  • = 运算符将所有元素从一个向量复制到另一个向量。
  • std::copy 复制一系列元素。

可能还有更多,这些是我能想到的一些方法。

回到最初的问题,你的循环现在要做的是:

  • 创建一个新向量,包括为其分配内存并复制元素
  • 释放向量的内存

这发生在每次迭代中。现在,即使你在循环之外声明它,你仍然需要复制元素(你可能必须使用std::copy 之类的东西。所以你得到的惩罚是在每次迭代时分配和释放内存。

从技术上讲,在循环之外定义它会更有效。但是,决定是否将其实际置于循环之外必须考虑在获得的性能改进和通过在循环之外定义它而获得的可读性损失之间的权衡。

通常,您希望变量的范围(即可以访问变量的程序部分)尽可能小。在这种特定情况下,除非它是对性能至关重要的部分并且这样做是有意义的(从您的 sn-p 来看,您不太清楚您想对循环内的 std::vector 做什么)并且向量是相当小,以至于内存分配/释放不是很慢,我会把它留在循环中。

【讨论】:

  • 谢谢保罗!我需要将sampleSize 增加到几十亿,因此性能至关重要,并且胜过可读性。所以我会试试 std::copy。
猜你喜欢
  • 2012-02-06
  • 2010-09-27
  • 2016-12-05
  • 1970-01-01
  • 2010-12-25
  • 2011-04-10
  • 2014-02-16
  • 2015-09-14
相关资源
最近更新 更多