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

       

Определение объекта set и заполнение его элементами


Перед использованием класса set необходимо включить соответствующий заголовочный файл:

#include <set>

Вот определение нашего множества стоп-слов:

set<string> exclusion_set;

Отдельные элементы могут добавляться туда с помощью операции insert(). Например:

exclusion_set.insert( "the" );

exclusion_set.insert( "and" );

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

typedef set< string >::difference_type diff_type;

set< string > exclusion_set;

ifstream infile( "exclusion_set" );

if ( ! infile )

{

    static string default_excluded_words[25] = {

        "the","and","but","that","then","are","been",

        "can"."can't","cannot","could","did","for",

        "had","have","him","his","her","its","into",

        "were","which","when","with","would"

    };

    cerr << "предупреждение! невозможно открыть файл стоп-слов! -- "

         << "используется стандартный набор слов \n";

    copy( default_excluded_words, default_excluded_words+25,

        inserter( exclusion_set, exclusion_set.begin() ));

}

else {

    istream_iterator<string,diff_type> input_set(infile),eos;

    copy( input_set, eos, inserter( exclusion_set,

        exclusion_set.begin() ));

}

В этом фрагменте кода встречаются два элемента, которые мы до сих пор не рассматривали: тип difference_type и класс inserter. difference_type – это тип результата вычитания двух итераторов для нашего множества строк. Он передается в качестве одного из параметров шаблона istream_iterator.

copy() –один из обобщенных алгоритмов. (Мы рассмотрим их в главе 12 и в Приложении.) Первые два параметра – пара итераторов или указателей – задают диапазон. Третий параметр является либо итератором, либо указателем на начало контейнера, в который элементы копируются.

Проблема с этой функцией вызвана ограничением, вытекающим из ее реализации: количество копируемых элементов не может превосходить числа элементов в контейнере-адресате. Дело в том, что copy() не вставляет элементы, она только присваивает каждому элементу новое значение. Однако ассоциативные контейнеры не позволяют явно задать размер. Чтобы скопировать элементы в наше множество, мы должны заставить copy() вставлять элементы. Именно для этого служит класс inserter (детально он рассматривается в разделе 12.4).



Содержание раздела