2. Стереть те элементы, которые нам не нужны; теперь они расположены в конце вектора.
Алгоритм remove возвращает новый логический конец данных, не изменяя размер контейнера. Мы можем стереть «мусор», начиная с возвращенного конца с помощью функции-члена erase, рассмотренной в конце раздела 1.3.
Следующая программа показывает, как это делается, удаляя все элементы, равные 1, из последовательности:
// remove.срр: Алгоритм remove.
#include <iostream> #include <vector> #include <algorithm> #include <iterator> using namespace std;
void out(const char *s, const vector<int> &v) { cout « s;
copy(v.begin(), v.endf),
ostream_iterator<int>(cout, " "));
cout << endl; }
int main()
{ vector<int> v;
vector<int>::iterator new_end;
v.push_back(l); v.push_back(4); v.push_back(l);
v.push_back(3); v.push_back(l); v.push_back(2);
out("Initial sequence v:\n", v);
new_end = remove(v.begin(), v.end(), 1);
outf'After new_end = remove (v. beginf) , " "v.endf), 1):\n", v);
v.erase(new_end, v.endf));
out("After v.erase(new_end, v.endf)):\n", v);
return 0; }
Начиная с последовательности {1,4,1,3,1,2}, эта программа логически удаляет элементы, равные 1; остающиеся элементы помещаются в первых
new_end - v.begin = 3
элементах, где new_end - значение, возвращаемое вызовом функции remove. Остальные три элемента, начиная с позиции newjsnd, затем стираются с помощью функции-члена erase. Вывод этой программы показан ниже:
Initial sequence v:
14 13 12
After new_end = remove(v.beginf), v.endf), 1):
4 3 2 3 12
After v.erase(new_end, v.endf)):
4 3 2
Стабильность алгоритма remove иллюстрируется порядком 4, 3, 2 оставшихся элементов - этот порядок совпадает с тем, в котором эти элементы встречались в исходной последовательности. Хотя алгоритм remove применим также и к спискам, для них определена функция-член remove, использование которой предпочтительнее, как мы увидим в разделе 3.5.
Существует также алгоритм remove_if, являющийся обобщенной версией remove, точно так же как find_if - обобщенная версия find. Следующая программа показывает, как мы можем использовать remove_if (опять совместно с функцией-членом erase), чтобы стереть все элементы, меньшие или равные 2:
<< назад вперед >>