Я определил узкое место в моем коде на C++, и моя цель - ускорить его. Я перемещаю элементы из одного вектора в другой вектор, если условие истинно.Быстрый способ push_back вектора много раз
В питоне, то вещий способ сделать это было бы использовать список понимание:
my_vector = [x for x in data_vector if x > 1]
Я взломал способ сделать это в C++, и он работает нормально. Тем не менее, я называю это миллионы раз в течение цикла, и он медленный. Я не очень разбираюсь в распределении памяти, но я предполагаю, что моя проблема связана с распределением памяти снова и снова с использованием push_back
. Есть ли способ распределить мою память по-другому, чтобы ускорить этот код? (Я не знаю, как большой my_vector
должен быть до for
-loop).
std::vector<float> data_vector;
// Put a bunch of floats into data_vector
std::vector<float> my_vector;
while (some_condition_is_true) {
my_vector.clear();
for (i = 0; i < data_vector.size(); i++) {
if (data_vector[i] > 1) {
my_vector.push_back(data_vector[i]);
}
}
// Use my_vector to render graphics on the GPU, but do not change the elements of my_vector
// Change the elements of data_vector, but not the size of data_vector
}
При поиске вещей, которые могут помочь, советуем обратиться к [reference] (http://en.cppreference.com/w/cpp/container/vector) для контейнера. Это поможет вам найти полезные функции, такие как 'reserve'. – NathanOliver
btw 'push_back' не всегда выделяет память. 'vector' резервирует некоторую память (которую вы можете проверить, вызвав метод capacity()' vector'), и когда 'size' достигает' capacity', выделяется только новая память. Но вы всегда можете сказать 'vector', чтобы зарезервировать некоторую память, прежде чем делать что-то с ней, вызывая' reserve' –
Вам нужно 'data_vector' после того, как вы скопировали его в' my_vector'? Может быть, «swap» будет вас устраивать? –