|
Программирование >> Инициализация объектов класса, структура
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() требует, чтобы компилятор работал с шаблонами функций-членов. Если ваш компилятор еще не поддерживает это свойство стандарта С++, то оба контейнера должны быть одного типа, например два списка или два вектора, содержащих элементы одного типа.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |