|
Программирование >> Инициализация объектов класса, структура
#include <algorithm> #include <vector> #include <iostream> int main() { int search value; int ia[ 6 T = { 27, 210, 12, 47, 109, 83 }; vector<int> vec( ia, ia+6 ); cout << enter search value: ; cin >> search value; vector<int>::iterator presult; presult = find( vec.begin(), vec.end(), search value ); cout << The value << search value << ( presult == vec.end() ? is not present : is present ) << endl; #include <algorithm> #include <list> #include <iostream> int main() { int search value; int ia[ 6 T = { 27, 210, 12, 47, 109, 83 }; list<int> ilist( ia, ia+6 ); cout << enter search value: ; cin >> search value; list<int>::iterator presult; presult = find( ilist.begin(), ilist.end(), search value ); cout << The value << search value << ( presult == ilist.end() ? is not present : is present ) << endl; find() можно применить и к списку: (В следующем разделе м1 обсудим построение программ:, в которой используются различные обобщенные алгоритм:, а затем рассмотрим объект:-функции. В разделе 12.4 м1 подробнее расскажем об итераторах. Развернутое введение в обобщенные алгоритме! - предмет раздела 12.5, а их детальное обсуждение и иллюстрация применения вынесено в Приложение. В конце главы речь пойдет о случаях, когда применение обобщенных алгоритмов неуместно.) Упражнение 12.1 Обобщенные алгоритмы критикуют за то, что при всей элегантности дизайна проверка корректности возлагается на программиста. Например, если передан неверный итератор или пара итераторов, помечающая неверный диапазон, то поведение программы не #include <vector> #include <string> typedef vector<string, allocator> textwords; void process vocab( vector<textwords, allocator> *pvec ) { if ( ! pvec ) { / / в1дать предупредительное сообщение return; ... на него, проверяя, не является ли он нулевым: Нужно создать один вектор, включающий все элементы исходных векторов. Это делается с помощью обобщенного алгоритма copy() (для его использования необходимо включить заголовочные файлы algorithm и iterator): определено. Вы согласны с такой критикой? Следует ли оставить применение обобщенных алгоритмов только наиболее квалифицированным специалистам? Может быть, нужно запретить использование потенциально опасных конструкций, таких, как обобщенные алгоритмы, указатели и явные приведения типов? 12.2. Использование обобщенных алгоритмов Допустим, м1 задумали написать книжку для детей и хотим понять, какой словарный состав наиболее подходит для такой цели. Чтобы ответить на этот вопрос, нужно прочитать несколько детских книг, сохранить текст в отдельных векторах строк (см. раздел 6.7) и подвергнуть его следующей обработке: 1. Создать копию каждого вектора. 2. Слить все векторы в один. 3. Отсортировать его в алфавитном порядке. 4. Удалить все дубликаты. 5. Снова отсортировать, но уже по длине слов. 6. Подсчитать число слов, длина которых больше шести знаков (предполагается, что длина - это некоторая мера сложности, по крайней мере, в терминах словаря). 7. Удалить семантически нейтральные слова (например, союзы and (и), if (если), or (или), but (но) и т.д.). 8. Напечатать получившийся вектор. На первый взгляд, задача на целую главу. Но с помощью обобщенных алгоритмов м1 решим ее в рамках одного подраздела. Аргументом нашей функции является вектор из векторов строк. Мы принимаем указатель #include <algorithm> #include <iterator> void process vocab( vector<textwords, allocator> *pvec ) { ... vector< string > texts; vector<textwords, allocator>::iterator iter = pvec->begin(); for ( ; iter != pvec->end(); ++iter ) copy( (*iter).begin(), (*iter).end(), back inserter( texts )); ... Первыми двумя аргументами алгоритма copy() являются итераторы, ограничивающие диапазон подлежащих копированию элементов. Третий аргумент - это итератор, указывающий на место, куда надо копировать элементы. back inserter называется адаптером итератора; он позволяет вставлять элементы в конец вектора, переданного ему в качестве аргумента. (Подробнее мы рассмотрим адаптеры итераторов в разделе 12.4.). Алгоритм unique() удаляет из контейнера дубликаты, расположенные рядом. Если дана последовательность 01123211, то результатом будет 012321, а не 0123. Чтобы получить вторую последовательность, необходимо сначала отсортировать вектор с помощью алгоритма sort() ; тогда из последовательности 01111223 получится 0123. (Хотя на самом деле получится 01231223.) unique() не изменяет размер контейнера. Вместо этого кажд1й уникальный элемент помещается в очередную свободную позицию, начиная с первой. В нашем примере физический результат - это последовательность 01231223; остаток 1223 - это, так сказать, отходы алгоритма. unique() возвращает итератор, указывающий на начало этого остатка. Как правило, этот итератор затем передается алгоритму erase() для удаления ненужных элементов. (Поскольку встроенный массив не поддерживает операции erase() , то семейство алгоритмов unique() в меньшей степени подходит для void process vocab( vector<textwords, allocator> *pvec ) { ... отсортировать вектор texts sort( texts.begin(), texts.end() ); удать дубкаты vector<string, allocator>::iterator it; it = unie( texts.begin(), texts.end() ); texts.erase( it, texts.end() ); ... работы с ним.) Вот соответствующий фрагмент функции: Ниже приведен результат печати вектора texts, объединяющего два небольших текстовых файла, после применения sort() , но до применения unique() :
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.158
При копировании материалов приветствуются ссылки. |