Итерация вектора C ++ - PullRequest
       33

Итерация вектора C ++

0 голосов
/ 12 июля 2020

У меня есть вектор int P = [n1, n2, n3]. каков наиболее эффективный способ сгенерировать другой вектор того же размера, что и P, назовите его v1 = [m1, m2, m3]. Шаг:

  1. vector P [N], N, содержит n0, n1, n2
  2. для каждого n_i в N, сгенерируйте вектор нормальной случайной величины с размером n0 , затем n1, n2
  3. Взять сумму каждого нового вектора независимо, sum (n0), sum (n1), sum (n2)
  4. Создайте вектор v1 [m1, m2, m3 ]. для каждого 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...
}

1 Ответ

0 голосов
/ 12 июля 2020

Вам наверняка понадобится что-то вроде этого:

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