C++矢量迭代

C++ Vector iteration

本文关键字:迭代 C++      更新时间:2023-10-16

我有一个向量int p=[n1,n2,n3]。生成另一个与P大小相同的向量的最有效方法是什么,称之为v1=[m1,m2,m3]。步骤:

  1. 矢量<int>P[N],N,包含n0,n1,n2
  2. 对于n中的每个n_i,生成大小为n0的正态随机变量的向量,然后是n1,n2
  3. 独立地取每个新矢量的和,sum(n0(,sum
  4. 创建向量v1[m1,m2,m3]。对于"i"中的每个i;v1";包含上一步骤中的随机数之和
const int N = 10;
vector<int> p;
vector <double> b;
for ( int i =0; i<N ; i++)

{

Poiss  = U.RandomPoisson(Lambda);  // generate N Poissonian Random variables

Normal = U.RandomNormal(4000,7000); // generate N Normal Random variable

p.push_back(Poiss);
b.push_back(Normal);

}

// iterate over P and use each element of p call it p[i] as the size of a new random vector with size p[i] call it vec[p[i]].  Take the sum of vec[p[i]] and add to a new vector call it V.   The Final size of V is the same as P 
for ( auto &i : p )
{
do some stuff...
}

您可能需要这样的东西:

vector<vector<int>> vec;
vector<int> v;
v.reserve(p.size());
for (auto &&i : p) {
vector<int> temp(i);
for (auto &&j : temp) 
j = U.RandomNormal(4000, 7000);
v.push_back(accumulate(temp.begin(), temp.end(), 0));
vec.push_back(move(temp));
}


代替

for (auto &&j : temp) 
j = U.RandomNormal(4000, 7000);

您可以直接使用:

std::generate(temp.begin(), temp.end(), [&U] () { return U.RandomNormal(4000, 7000); });


如果不需要vec,即只需要v内的值,则执行以下操作:

vector<int> v;
v.reserve(p.size());
for (auto &&i : p) {
int sum = 0;
for (int j = 0; j < i; ++j) 
sum += U.RandomNormal(4000, 7000);
v.push_back(sum);
}