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:


<< назад вперед >>