快速推送矢量多次的方法

Pau*_*ger 0 c++ vector

我已经确定了我的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_vectorfor-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)

sjr*_*son 7

使用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.