C ++: объявить вектор внутри или снаружи цикла

Я хотел бы перебрать несколько случайных комбинаций. В настоящее время я определяю вектор 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() добавить новые значения в вектор.

0

Решение

Существует несколько способов присвоения значений в векторе, кроме push_back:

  • Оператор [] дает вам доступ на чтение / запись к отдельному элементу вектора, так что вы можете сделать v[5] = 10, Поместите это в цикл for, получите доступ к элементам на основе индекса цикла.
  • Оператор = копирует все элементы из одного вектора в другой.
  • std::copy копирует ряд элементов.

Есть, вероятно, гораздо больше, вот некоторые из способов, которые я мог придумать.

Возвращаясь к первоначальному вопросу, что делает ваш цикл:

  • Создайте новый вектор, который включает выделение памяти для него и копирование элементов
  • Освободите память вектора

Это происходит на каждой итерации. Теперь, даже если вы объявите это вне цикла, вам все равно придется копировать элементы (вы должны использовать что-то вроде std::copy наверное. Таким образом, вы получаете наказание за выделение и освобождение памяти на каждой итерации.

Технически было бы более эффективно определить его вне цикла. Однако решение о том, размещать ли его вне цикла, должно учитывать компромисс между улучшением производительности, которое вы получаете, и штрафом за читабельность, который вы получаете, определяя его вне цикла.

В общем, вы хотите, чтобы область видимости переменных (т. Е. Той части программы, где эти переменные были доступны) была как можно меньше. В этом конкретном случае, если только это не критичный к производительности раздел, и в этом есть смысл (из вашего фрагмента, не очень понятно, что вы хотите с этим делать std::vector внутри цикла), и векторы достаточно малы, так что распределение / освобождение памяти происходит не очень медленно, я бы оставил его в цикле.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]