Программирование >>  Инициализация объектов класса, структура 

1 ... 84 85 86 [ 87 ] 88 89 90 ... 395


const vector< int > ivec;

vector< string > svec;

list< int > ilist;

(a) vector<int>::iterator it = ivec.begin();

(b) list<int>::iterator it = ilist.begin()+;

(c) vector<string>::iterator it = &svec[0];

(d) for ( vector<string>::iterator it = svec.begin(); it != 0; ++it )

...

Упражнение 6.10

int ia[7] = { 0, 1, 1, 2, 3, 5, 8 };

string sa[6] = {

Fort Sumter , Manassas , Perryville , Vicksburg , Meridian , Chancellorsvine };

(a) vector<string> svec( sa, &sa[6] );

(b) list<int> ilist( ia+4, ia+6 );

(c) list<int> ilist2( ilist.begin(), ilist.begin()+2 );

(d) vector<int> ivec( &ia[0], ia+8 );

(e) list<string> slist( sa+6, sa );

Найдите ошибки в использовании итераторов:

(f) vector<string> svec2( sa, sa+6 );

6.6. Операции с последовательными контейнерами

Функция-член push back() позволяет добавить единственный элемент в конец контейнера. Но как вставить элемент в произвольную позицию? А целую последовательность элементов? Для этих случаев существуют более общие операции.

vector< string > svec; list< string > slist; string spouse( Beth );

slist.insert( slist.begin(), spouse );

Например, для вставки элемента в начало контейнера можно использовать:

svec.insert( svec.begin(), spouse );

Первый параметр функции-члена insert() (итератор, адресующий некоторый элемент контейнера) задает позицию, а второй - вставляемое перед этой позицией значение. В примере выше элемент добавляется в начало контейнера. А так можно реализовать вставку в произвольную позицию:



string son( Danny );

list<string>::iterator iter;

iter = find( slist.begin(), slist.end(), son );

slist.insert( iter, spouse );

Здесь find() возвращает позицию элемента в контейнере, если элемент найден, либо итератор end() , если ничего не найдено. (Мы вернемся к функции find() в конце следующего раздела.) Как можно догадаться, push back() эквивалентен следующей

эквивалентна вызов: slist.push back( value );

записи:

slist.insert( slist.end(), value );

Вторая форма функции-члена insert() позволяет вставить указанное количество одинаковых элементов, начиная с определенной позиции. Например, если мы хотим

vector<string> svec; string anna( Anna );

добавить десять элементов Anna в начало вектора, то должны написать:

svec.insert( svec.begin(), 10, anna );

insert() имеет и третью форму, помогающую вставить в контейнер несколько элементов. Допустим, имеется следующий массив:

string sarray[4] = { quasi , simba , frollo , scar }; Мы можем добавить все его элементы или только некоторый диапазон в наш вектор

svec.insert( svec.begin(), sarray, sarray+4 ); svec.insert( svec.begin() + svec.size()/2,

строк:

sarray+2, sarray+4 );

вставляем элементы svec в середину svec two

svec two.insert( svec two.begin() + svec two.size()/2,

Такой диапазон отмечается и с помощью нары итераторов

svec.begin(), svec.end() );



list< string > slist;

...

вставляем элементы svec перед элементом, содержащим stringVal list< string >::iterator iter =

find( slist.begin(), slist.end(), stringVal );

или любого контейнера, содержащего строки:14

slist.insert( iter, svec.begin(), svec.end() );

6.6.1. Удаление

В общем случае удаление осуществляется двумя формами функции-члена erase() . Первая форма удаляет единственный элемент, вторая - диапазон, отмеченный парой итераторов. Для последнего элемента можно воспользоваться функцией-членом pop back() .

При вызове erase() параметром является итератор, указывающий на нужный элемент. В следующем фрагменте кода мы воспользуемся обобщенным алгоритмом find() для

string searchValue( Quasimodo ); list< string >::iterator iter =

find( slist.begin(), slist.end(), searchValue ); if ( iter != slist.end() )

нахождения элемента и, если он найден, передадим его адрес функции-члену erase() .

slist.erase( iter );

Для удаления всех элементов контейнера или некоторого диапазона можно написать

удаляем все элементы контейнера

slist.erase( slist.begin(), slist.end() );

удаляем элементы, помеченные итераторами list< string >::iterator first, last;

first = find( slist. begin(), slist.end(), vail ) last = find( slist.begin(), slist.end(), va12 );

... проверка first и last

следующее:

slist.erase( first, last );

14 Последняя форма insert() требует, чтобы компилятор работал с шаблонами функций-членов. Если ваш компилятор еще не поддерживает это свойство стандарта С++, то оба контейнера должны быть одного типа, например два списка или два вектора, содержащих элементы одного типа.



1 ... 84 85 86 [ 87 ] 88 89 90 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика