1

I would like to loop over several random combinations. Currently, I define a vector v with the numbers 1 to n outside the loop, shuffle v inside the loop and define a new vector combination inside the loop.

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);
};

It seems weird to me that I define combination again in every iteration of the for loop. Would it make sense to declare combination outside of the for loop and then assign new values to it in every iteration? If so, what would be a good way to assign those new values to combination? So far, I have only used push_back() to append new values to a vector.

4

1 回答 1

3

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

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

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

回到最初的问题,您的循环现在所做的是:

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

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

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

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

于 2018-04-01T06:15:22.743 回答