Я хотел бы перебрать несколько случайных комбинаций. В настоящее время я определяю вектор v
с номерами 1
в n
вне цикла, перемешать 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);
};
Мне кажется странным, что я определяю combination
снова в каждой итерации цикла for. Имеет ли смысл объявить combination
вне цикла for, а затем присваивать ему новые значения в каждой итерации? Если это так, что будет хорошим способом присвоить эти новые значения combination
? До сих пор я использовал только push_back()
добавить новые значения в вектор.
Существует несколько способов присвоения значений в векторе, кроме push_back
:
v[5] = 10
, Поместите это в цикл for, получите доступ к элементам на основе индекса цикла.std::copy
копирует ряд элементов.Есть, вероятно, гораздо больше, вот некоторые из способов, которые я мог придумать.
Возвращаясь к первоначальному вопросу, что делает ваш цикл:
Это происходит на каждой итерации. Теперь, даже если вы объявите это вне цикла, вам все равно придется копировать элементы (вы должны использовать что-то вроде std::copy
наверное. Таким образом, вы получаете наказание за выделение и освобождение памяти на каждой итерации.
Технически было бы более эффективно определить его вне цикла. Однако решение о том, размещать ли его вне цикла, должно учитывать компромисс между улучшением производительности, которое вы получаете, и штрафом за читабельность, который вы получаете, определяя его вне цикла.
В общем, вы хотите, чтобы область видимости переменных (т. Е. Той части программы, где эти переменные были доступны) была как можно меньше. В этом конкретном случае, если только это не критичный к производительности раздел, и в этом есть смысл (из вашего фрагмента, не очень понятно, что вы хотите с этим делать std::vector
внутри цикла), и векторы достаточно малы, так что распределение / освобождение памяти происходит не очень медленно, я бы оставил его в цикле.
Других решений пока нет …