Язык программирования C++. Вводный курс

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


Функция-член 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()

позволяет вставить указанное количество одинаковых элементов, начиная с определенной позиции. Например, если мы хотим добавить десять элементов Anna в начало вектора, то должны написать:

vector<string> svec;

string 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() );

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



list< string > slist;

// ...

// вставляем элементы svec

// перед элементом, содержащим stringVal

list< string >::iterator iter =

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


Содержание раздела