|
Программирование >> Инициализация объектов класса, структура
#include <algorithm> #include <vector> #include <iostream.h> int main() vector< int, allocator > vec; for ( int ix = 0; ix < 20; ix++ ) vec.push back( ix ); random shuffle( vec.begin(), vec.end() ); печатает: random shuffle для последовательности 1 .. 20: 6 11 9 2 18 12 17 7 0 15 4 8 10 5 1 19 13 3 14 16 cout << random shuffle для последовательности 1 .. 20:\n ; copy( vec.begin(), vec.end(), ostream iterator< int >( cout, )); template< class ForwardIterator, class Type > ForwardIterator remove( ForwardIterator first, Алгоритм remove() ForwardIterator last, const Type &value ); remove() удаляет из диапазона [first,last) все элементы со значением value. Этот алгоритм (как и remove if() ) на самом деле не исключает элементы из контейнера (т. е. размер контейнера сохраняется), а перемещает каждый оставляемый элемент в очередную позицию, начиная с first. Возвращаемый итератор указывает на элемент, следующий за позицией, в которую помещен последний неудаленный элемент. Рассмотрим, например, последовательность {0,1,0,2,0,3,0,4}. Предположим, что нужно удалить все нули. В результате получится последовательность {1,2,3,4,0,4,0,4}. 1 помещена в первую позицию, 2 - во вторую, 3 - в третью и 4 - в четвертую. Элементы, начиная с 0 в пятой позиции, - это отходы алгоритма. Возвращенный итератор указывает на 0 в пятой позиции. Обгчно этот итератор затем передается алгоритму erase() , который удаляет неподходящие элементы. (При работе со встроенным массивом лучше использовать алгоритмы remove copy() и remove copy if() , а не remove() и remove if() , поскольку его размер невозможно изменить) Алгоритм remove copy() template< class InputIterator, class OutputIterator, class Type > OutputIterator remove copy( InputIterator first, InputIterator last, OutputIterator result, const Type &value ); remove copy() копирует все элементы, кроме имеющих значение value, в контейнер, на начало которого указывает result. Возвращаемый итератор указывает на элемент за #include <algorithm> #include <vector> #include <assert.h> #include <iostream.h> /* печатается: исходн вектор: 0 1 0 2 0 3 0 4 0 5 вектор после remove до erase(): 1 2 3 4 5 3 0 4 0 5 вектор после erase(): 1 2 3 4 5 массив после remove copy() 1 2 3 4 5 int main() int value = 0; int ia[] = { 0, 1, 0, 2, 0, 3, 0, 4, 0, 5 }; vector< int, allocator > vec( ia, ia+10 ); ostream iterator< int > ofile( cout, ); vector< int, allocator >::iterator vec iter; cout << исходн вектор:\n ; copy( vec.begin(), vec.end(), ofile ); cout << \n; vec iter = remove( vec.begin(), vec.end(), value ); cout << вектор после remove до erase():\n ; copy( vec.begin(), vec.end(), ofile ); cout << \n; / / удать из контейнера неподходяще элементы vec.erase( vec iter, vec.end() ); cout << вектор после erase():\n ; copy( vec.begin(), vec.end(), ofile ); cout << \n; int ia2[5]; vector< int, allocator > vec2( ia, ia+10 ); remove copy( vec2.begin(), vec2.end(), ia2, value ); cout << массив после remove copy():\n ; copy( ia2, ia2+5, ofile ); cout << endl; последним скопированн1м. Исходный контейнер не изменяется. template< class ForwardIterator, class Predicate > ForwardIterator remove if( ForwardIterator first, Алгоритм remove if() ForwardIterator last, Predicate pred ); remove if() удаляет из диапазона [first,last) все элементы, для которых значение предиката pred равно true. remove if() (как и remove() ) фактически не исключает удаленные элементы из контейнера. Вместо этого каждый оставляемый элемент перемещается в очередную позицию, начиная с first. Возвращаемый итератор указывает на элемент, следующий за позицией, в которую помещен последний неудаленный элемент. Обычно этот итератор затем передается алгоритму erase() , который удаляет неподходящие элементы. (Для встроенных массивов лучше использовать алгоритм remove copy if() .) template< class InputIterator, class OutputIterator, class Predicate > OutputIterator remove copy if( InputIterator first, InputIterator last, Алгоритм remove copy if() OutputIterator result, Predicate pred ); remove copy if() копирует все элементы, для которых предикат pred равен false, в контейнер, на начало которого указывает итератор result. Возвращаемый итератор указывает на элемент, расположенный за последним скопированн1м. Исходный контейнер остается без изменения.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.003
При копировании материалов приветствуются ссылки. |