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