您可以在下面的代码中向我解释一下我做错了什么吗? 我希望第二个向量中的值> = 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;
}
答案 0 :(得分:6)
函数std::remove_copy_if()
将非匹配元素从一个序列复制到另一个序列。电话
remove_copy_if(vec1.begin(), vec1.end(), vec2.begin(), compare);
假设从vec2.begin()
开始有一个合适的序列,实际上并非如此:没有任何东西。如果reserve()
没有任何内存vec2
d,您可能会遇到崩溃。你想要的是一个迭代器,它根据需要扩展序列:
std::remove_copy_if(vec1.begin(), vec1.end(), std::back_inserter(vec2), compare);
有了这个,reserve()
的调用不是必需的,只是潜在的性能优化。
答案 1 :(得分:4)
标准算法适用于迭代器,并且对迭代器所属的容器一无所知。您将vec2.begin()
作为输出迭代器参数传递给remove_copy_if
,它将盲目地递增它,不知道vec2
为空,运行已分配的空间。您需要在调用之前传递back_insert_iterator
或将向量调整为合适的大小。