我已经确定了我的c ++代码中的瓶颈,我的目标是加速它.如果条件为真,我将项目从一个向量移动到另一个向量.
在python中,这样做的pythonic方法是使用列表理解:
my_vector = [x for x in data_vector if x > 1]
Run Code Online (Sandbox Code Playgroud)
我已经破解了一种在C++中执行此操作的方法,并且它运行正常.但是,我在一个while循环中调用了数百万次,而且速度很慢.我对内存分配了解不多,但我认为我的问题与使用重新分配内存有关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
}
Run Code Online (Sandbox Code Playgroud)
使用std::copy_if和储备data_vector.size()的my_vector开始(因为这是它的谓语可能评估为true元素的最大可能数):
std::vector<int> my_vec;
my_vec.reserve(data_vec.size());
std::copy_if(data_vec.begin(), data_vec.end(), std::back_inserter(my_vec),
[](const auto& el) { return el > 1; });
Run Code Online (Sandbox Code Playgroud)
请注意,reserve如果您希望谓词计算为true的次数远小于该值,则可以避免此处的调用data_vector.