Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 66
Текст из файла (страница 66)
begin (while(p != Istl. end () ) (cout « *p;P++;}cout « endl;cout « "Содержимое второго списка :p - Ist2.begin() ;whileip != Ist2.end()) {cout « *p;cout « endl;// Слияние двух списковIstl.merge(Ist2);if {Ist2.empty() )cout « "Теперь второй список пуст\п";Глава14.Библиотекастандартныхшаблонов_443_cout « "Содержимое первого списка после слияния :\п";р = Istl. begin ( ) ;while (p 1= I s t l .
e n d O ) {cout « *p;return 0;После выполнения программы на экране появится следующее:Содержимое первого списка: ACEGIСодержимое второго списка: BDFHJТеперь второй список пустСодержимое первого списка после слияния:ABCDEFGHIJ6. В следующем примере список используется для хранения объектов типаProject. Project — это класс, с помощью которого организуется управлениепрограммными проектами.
Обратите внимание, что для объектов типа Projectперегружаются операторы <, >, != и ==. Перегрузки этих операторов требуеткомпилятор Microsoft Visual C+4- 5. (Именно этот компилятор использовалсяпри отладке примеров данной главы.) Для других компиляторов может потребоваться перегрузить какие-либо дополнительные операторы. В библиотеке стандартных шаблонов с помощью указанных оператор -функций сравниваются объекты, хранящиеся в контейнере.
Хотя список не является контейнером с упорядоченным хранением элементов, тем не менее и здесь припоиске, сортировке или слиянии элементы приходится сравнивать.^include <iostream>^include <list>#include <cstring>using namespace std;class Project {public:char name [40] ;int days_to_completion;ProjectO {strcpy (name, " ") ;days__to_completion = 0;}Project (char *n, int d) {strcpy {name, n) ;days_to_completion = d;\444Самоучитель C++void add_days(int i) (days_tcj_completion += i;void sub_days(int i) {days_to_completion -= i;}bool completed() { return !days_to_completion; }void report() {cout « name « ": ";cout « days__to_completion;cout « " дней до завершения\п";bool operator<(const Project &a, const Project sb)return a,days_to_completion < b.days_to_completion;bool operator>(const Project &a, const Project &b)ireturn a.days_to_completion > b.days_to_completion;bool operator==(const Project &a, const Project &b)return a.days_to_completion == b.days_to_completion;}bool operator!=(const Project &a, const Project &b)return a.days_to_completion != b.days_to_completion;int main()list<Project> proj;proj.push_back(Project("Разработка компилятора", 35});proj.push_back(Project("Разработка электронной таблицы", 190))proj.push_back(Project{"Разработка STL", 1000});list<Project>::iterator p = proj.begin(};// вывод проектов на экранwhile (p != proj.endO) {p->report(};P++;Глава 14.
Библиотека стандартных шаблонов445// увеличение сроков выполнения первого проекта на 10 днейр = proj.begin();p~>add_days{10);// последовательное завершение первого проектаdo {p->sub_days(5);p->report () ;} while (!p->completeci{) ) ;return 0;После выполнения программы на экране появится следующее:Разработка компилятора: 35 дней до завершенияРазработка электронной таблицы: 190 дней до завершенияРазработка STL: 1000 дней до завершенияРазработка компилятора: 40 дней до завершенияРазработка компилятора: 35 дней до завершенияРазработка компилятора: 30 дней до завершенияРазработка компилятора: 25 дней до завершенияРазработка компилятора: 20 дней до завершенияРазработка компилятора: 15 дней до завершенияРазработка компилятора: 10 дней до завершенияРазработка компилятора: 5 дней до завершенияРазработка компилятора: 0 дней до завершения1.
Поэкспериментируйте с представленными примерами. Попытайтесь делатьнебольшие изменения в программах и исследуйте результаты.2. В примере 1 после вывода информации на экран список опустел. В примере2 вы узнали об одном из способов исследования содержимого списка, прикотором он остается неповрежденным. Можете ли вы придумать другой способ просмотреть список, не опустошая его при этом? Продемонстрируйтеваше решение, заменив необходимые инструкции в программе из примера 1.3. Отталкиваясь от программы из примера 6, создайте еще один список, в котором представьте следующие проекты:ПроектСрок завершенияРазработка базы данныхРазработка стандартных писемРазработка объектов СОМ78050300446Самоучитель C++После создания второго списка выполните сортировку и затем слияние обоих списков.
Выведите на экран итоговый результат.14.5. Ассоциативные спискиКласс тар поддерживает ассоциативный контейнер, в котором каждому значению соответствует уникальный ключ. По существу, ключ — это просто имя,которое вы присваиваете значению. После того как значение помещено вконтейнер, извлечь его оттуда можно с помощью ключа. Таким образом, всамом общем смысле можно сказать, что ассоциативный список представляетсобой список пар ключ/значение. Преимущество ассоциативных списков состоит в возможности получения значения по данному ключу.
Например, используя ассоциативный список, можно хранить имена телефонных абонентовв качестве ключей, а номера телефонов в качестве значений. Ассоциативныеконтейнеры в программировании становятся все более и более популярными.Как уже упоминалось, в ассоциативном списке можно хранить только уникальные ключи. Дублирования ключей не допускается. Для создания ассоциативного списка с неуникальными ключами используется класс-контейнерmultimap.Ниже представлена спецификация шаблона для класса тар:template<class Key, class Т, class Comp = less<Key>,class Allocator = allocator<T»class mapЗдесь Key — это данные типа ключ, Т — тип данных, предназначенных дляхранения (в карте), a Comp - функция для сравнения двух ключей, которойпо умолчанию является стандартная объект-функция lessQ, Ключевое словоAllocator задает распределитель памяти (которым по умолчанию являетсяallocator).В классе тар определены следующие конструкторы:explicit map (const Comp &ф_сравн = СошрО,const Allocator Sa = Allocator());map (const map<Key, T, Comp, Allocator>fiooieJC!r) ;teroplate<class Inlter>map(Inlter начало, Inlter конец,const Comp &ф_сравн = CompO , const Allocator &a = Allocator ()) ;Первая форма представляет собой конструктор пустого ассоциативного списка.
Вторая форма конструктора предназначена для ассоциативного спискаиз одинаковых элементов, каждый из которых — это объект. Третья форма — это конструктор ассоциативного списка, содержащего диапазон элементов, заданный итераторами начало и конец. Функция сравнения ф_сравн,Глава 14. Библиотека стандартных шаблонов447если она присутствует, задает порядок сортировки элементов ассоциативного списка.Как правило, для любого объекта, заданного в качестве ключа, должны бытьопределены конструктор по умолчанию и несколько операторов сравнения.Для класса тар определяются следующие операторы сравнения:= = , <, <=, !=, >, >=В табл. 14.4 представлены функции — члены класса тар. В данной таблицетип key_type — это тип ключа, a key_value — тип пары ключ/значение (типpair < Key, T>).Таблица 14.4.
Функции — члены класса тарФункция-членОписаниеiterator beginf);Возвращает итератор первого элемента ассоциативного спискаconstjterator begin() const;void clear();Удаляет все элементы ассоциативного спискаsize_type count(const key_type &k) const;Возвращает 1 или 0, в зависимости от того,встречается или нет в ассоциативном спискеключ kbool emptyO const;Возвращает истину, если вызывающий ассоциативный список пуст, в противном случаевозвращает ложьiterator end();const_iterator end() const;Возвращает итератор конца ассоциативногоспискаpair<iterator, lterator>equal_range (constkey_type &k);pair<const_iterator,const_Iterator>equal_range(constkey^type &k) const;Возвращает пару итераторов, которые указывают на первый и последний элементы ассоциативного списка, содержащего указанныйключ kvoid erase(iterator /);Удаляет элемент, на который указывает итератор ivoid eraseflterator начало,iterator конец);Удаляет элементы, заданные между итераторами начало и конецsize_type erase(const key_type &k);Удаляет элементы,нию ключа kiterator find(const key_type &k);constjterator find(const key_type &k) const;Возвращает итератор по заданному ключу к.Если ключ не обнаружен, возвращает итератор конца ассоциативного спискаallocator_typeget_allocator() const;Возвращает распределитель памяти ассоциативного спискасоответствующие значе-Самоучитель C++448Таблица 14.4 (продолжение)Функция-членОписаниеiterator insertffterator /,const value_type ^значение);Вставляет параметр значение на место элемента или после элемента, заданного итератором i".