为什么remove_copy_if返回一个空向量



你能解释一下我在下面的代码中做错了什么吗?我希望第二个向量中的值>=80,但它是空的。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Tester
{
    public:
        int value;
        Tester(int foo)
        {
            value = foo;
        }
};
bool compare(Tester temp)
{
    if (temp.value < 80)
        return true;
    else
        return false;
}
int main()
{
    vector<Tester> vec1;
    vector<Tester> vec2;
    vec1.reserve(100);
    vec2.reserve(100);
    for(int foo=0; foo<100; ++foo)
        vec1.push_back(Tester(foo));
    remove_copy_if(vec1.begin(), vec1.end(), vec2.begin(), compare);
    cout<< "Size: " << vec2.size() << endl;
    cout<< "Elements"<<endl;
    for(int foo=0; foo < vec2.size(); ++foo)
        cout << vec2.at(foo).value << " ";
    cout<<endl;
    return 0;
}
函数std::remove_copy_if()将不匹配的元素从一个序列复制到另一个序列。呼叫
remove_copy_if(vec1.begin(), vec1.end(), vec2.begin(), compare);

假设有一个合适的序列从vec2.begin()开始,但事实并非如此:什么都没有。如果vec2没有任何内存reserve()d,您可能会崩溃。你想要的是一个迭代器,它可以根据需要扩展序列:

std::remove_copy_if(vec1.begin(), vec1.end(), std::back_inserter(vec2), compare);

这样就不需要调用reserve(),而只是潜在的性能优化。

标准算法处理迭代器,对迭代器所属的容器一无所知。您将vec2.begin()作为输出迭代器参数传递给remove_copy_if,它会盲目地递增,而不知道vec2是空的,耗尽了分配的空间。在调用之前,您需要传递一个back_insert_iterator或将向量调整为合适的大小。

相关内容

  • 没有找到相关文章

最新更新