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

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


vector< string >::iterator iter = buffer.begin(); for ( ; iter != buffer.end(), iter++ )

slist.push back( *iter ); if ( ! do something( slist )) slist.pop back();

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

6.6.2. Присваивание и обмен

Что происходит, если м1 присваиваем один контейнер другому? Оператор присваивания копирует элементы из контейнера, стоящего справа, в контейнер, стоящий слева от знака

svecl содержит 10 элементов svec2 содержит 24 элемента

после присваивания оба содержат по 24 элемента равенства. А если эти контейнеры имеют разный размер? Например:

svecl = svec2;

Контейнер-адресат (svec1) теперь содержит столько же элементов, сколько контейнер-источник (svec2). 10 элементов, изначально содержавшихся в svec1, удаляются (для каждого из них вызывается деструктор класса string).

Функция обмена swap () может рассматриваться как дополнение к операции присваивания. Когда мы пишем:

svecl.swap( svec2 );

svec1 после вызова функции содержит 24 элемента, которые он получил бы в результате присваивания:

svecl = svec2;

но зато теперь svec2 получает 10 элементов, ранее находившихся в svec1. Контейнеры обмениваются своим содержимым.

6.6.3. Обобщенные алгоритмы

Операции, описанные в предыдущих разделах, составляют набор, поддерживаемый непосредственно контейнерами vector и deque. Согласитесь, что это весьма небогатый интерфейс и ему явно не хватает базовых операций find() , sort() , merge() и т.д. Планировалось вынести общие для всех контейнеров операции в набор обобщенных алгоритмов, которые могут применяться ко всем контейнерным типам, а также к массивам встроенных типов. (Обобщенные алгоритмы описываются в главе 12 и в Приложении.) Эти алгоритма: связываются с определенным типом контейнера с

Парной но отношению к push back() является функция-член pop back (), удаляющая



#include <list> #include <vector>

int ia[ 6 ] = { 0, 1, 2, 3, 4, 5 };

vector<string> svec;

list<double> dtist;

/ / соответствщий заголовочн файл #include <algorithm> vector<string>::iterator viter; list<double>::iterator liter; #int *pia;

find() возвращает итератор на найденный для массива возвращается указатель ... pia = find( &ia[0], &ia[6], some int value ); liter = find( dlist.begin(), dlist.end(), some double value );

элемент

выглядят вызовы алгоритма find() для списка, вектора и массива разных типов:

viter = find( svec.begin(), svec.end(), some string value );

Контейнер list поддерживает дополнительные операции, такие, как sort() и merge(), поскольку в нем не реализован произвольный доступ к элементам. (Эти операции описаны в разделе 12.6.)

Теперь вернемся к нашей поисковой системе.

Упражнение 6.11

int ia[] = { 1, 5, 34 }; int ia2[] = { 1, 2, 3 };

int ia3[] = { 6, 13, 21, 29, 38, 55, 67, 89 };

Напишите программу, в которой определены следующие объекты:

vector<int> ivec;

Используя различные операции вставки и подходящие значения ia, ia2 и ia3, модифицируйте вектор ivec так, чтобы он содержал последовательность:

{ 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 }

Упражнение 6.12

int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 };

Напишите программу, определяющую данные объекты:

list<int> ilist ( ia, ia+11 );

Используя функцию-член erase() с одним параметром, удалите из ilist все нечетные элементы.

помощью передачи им в качестве параметров пары соответствующих итераторов. Вот как



istream&

функцию getline() :

getline( istream &is, string str, char delimiter );

getline() берет из входного потока все символы, включая пробелы, и помещает их в объект тина string, до тех нор пока не встретится символ delimiiter, не будет достигнут конец файла или количество полученных символов не станет равным величине, возвращаемой функцией-членом miax size() класса string.

Мы будем помещать каждую такую строку в вектор.

Мы вынесли код, читающий файл, в функцию, названную retrieve text() . В объекте тина pair дополнительно сохраняется размер и номер самой длинной строки. (Полный текст программы приводится в разделе 6.14.)

Вот реализация функции ввода файла:15

15 Программа компилировалась компилятором, не поддерживающим значений параметров по умолчанию шаблонов. Поэтому нам пришлось явно указать аллокатор:

vector<string,allocator> *lines of text;

Для компилятора, полностью соответствующего стандарту С++, достаточно отметить тип элементов:

vector<string> *lines of text;

6.7. Читаем текстовый файл

Первая наша задача - прочитать текстовый файл, в котором будет производиться поиск. Нам нужно сохранить следующую информацию: само слово, номер строки и позицию в строке, где слово встречается.

Как получить одну строку текста? Стандартная библиотека предоставляет для этого



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

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