Could you please explain to me what am I doing wrong in the following code?
I would expect values >= 80 in the second vector but it’s empty.
#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;
}
The function
std::remove_copy_if()copies the non-matching elements from one sequence to another sequence. The callassumes that there is a suitable sequence starting at
vec2.begin()which is actually not the case: there is nothing. If there weren’t any memoryreserve()d forvec2you would probably get a crash. What you want is an iterator which expand the sequence as necessary:With this the call to
reserve()isn’t necessary but only a potential performance optimization.