Здравствуйте, Balsamo, Вы писали:
B>У меня вопрос.
B>Если я запоминаю итератор, указывающий на какой-то элемен в векторе, а потом этот лемент удаляю, то итератор должен стать некорректным. Это верно?
B>Ес да, то как тогда можно вытащить из вектора все элементы, удовлетворяющие необходимому условию, и вставить их в другой вектор, содержание которого соответвтвует условию?
Это можно сделать в три приёма. Сначала копируешь элементы из одного вектора в другой с помощью remove_copy_if, потом удаляешь в первом векторе элементы соответствующие твоему условию с помощью remove_if и наконец заканчиваешь удаление методом vector::erase. Вот пример:
#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>
using std::vector;
using std::unary_function;
using std::not1;
using std::cout;
using std::ostream_iterator;
using std::endl;
struct pred : unary_function<int, bool>
{
result_type operator()(argument_type x) const
{
return x < 6;
}
};
int main()
{
int a[] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v(a, a + sizeof(a)/sizeof(a[0]));
vector<int> v2;
remove_copy_if(v.begin(), v.end(), back_inserter(v2), not1(pred()));
vector<int>::iterator last = remove_if(v.begin(), v.end(), pred());
v.erase(v.begin(), last);
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
cout << endl;
copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
}
Вывод:
6 7 8 9 10
1 2 3 4 5