С++ для начинающих


         

и multiset ничем не отличаются


void code_fragment()

{

    multimap< string, string > authors;

    // ...

    string search_item( "Haruki Murakami" );

    while ( cin && cin >> search_item )

        switch ( authors.count( search_item ))

        {

          // не найдено

          case 0:

            break;

         // найден 1, обычный find()

         case 1: {

           multimap< string, string >: iterator iter;

           iter = authors.find( search_item );

           // обработка элемента ...

           break;

         }

         // найдено несколько ...

         default:

         {

            typedef multimap<string,string>::iterator iterator;

            pair< iterator, iterator > pos;

            // pos.first - адрес 1-го найденного

            // pos.second - адрес 1-го отличного

            // от найденного

            pos = authors.equa1_range( search_item );

            for (; pos.first != pos.second; pos.first++ )

                // обработка элемента ...

         }

       }

}

Вставка и удаление элементов в multimap и multiset ничем не отличаются от аналогичных операций с контейнерами map и set. Функция equal_range() доставляет итераторную пару, задающую диапазон удаляемых элементов:

#include <multimap>

#include <string>

typedef multimap< string, string >::iterator iterator;

pair< iterator, iterator > pos;

string search_item( "Kazuo Ishiguro" );

// authors - multimap<string, string>

// эквивалентно

// authors.erase( search_item );

pos = authors.equa1_range( search_item );

authors.erase( pos.first, pos.second );

При каждом вызове функции-члена insert() добавляется новый элемент, даже если в контейнере уже был элемент с таким же ключом. Например:

typedef multimap<string,string>::value_type valType;

multimap<string,string> authors;

// первый элемент с ключом Barth

authors.insert( valType (

    string( "Barth, John" ),

    string( "Sot-Weed Factor" )));

// второй элемент с ключом Barth

authors.insert( va1Type(

    string( "Barth, John" ),

    string( "Lost in the Funhouse" )));

Контейнер multimap не поддерживает операцию взятия индекса. Поэтому следующее выражение ошибочно:

authors[ "Barth, John" ]; // ошибка: multimap

Упражнение 6.28

Перепишите программу текстового поиска из раздела 6.14 с использованием multimap для хранения позиций слов. Каковы производительность и дизайн в обоих случаях? Какое решение вам больше нравится? Почему?


Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий