Операции над множествами и мультимножествами. Операции создания, копирования и уничтожения

   
На этом шаге мы рассмотрим конструкторы и деструктор множеств и мультимножеств.

   
В таблице 1 представлены конструкторы и деструктор множеств и мультимножеств.

Таблица 1. Конструкторы и деструктор множеств и мультимножеств

Операция Описание
set с Создает пустое множество или мультимножество, не содержащее ни одного элемента
set c(op) Создает пустое множество или мультимножество, использующее критерий сортировки ор
set с1(c2) Создает копию другого множества или мультимножества того же типа (с копированием всех элементов)
set c(beg,end) Создает множество или мультимножество, инициализированное элементами интервала [beg,end)
set c(beg,end,op) Создает множество или мультимножество с критерием сортировки ор, инициализированное элементами интервала [beg,end)
c.~set() Уничтожает все элементы и освобождает память

   
В таблице символами "set" обозначена одна из следующих конструкций:

  • set<Elem> - множество с сортировкой по критерию less<> (оператор <);
  • set<Elem,op> - множество с сортировкой по критерию ор;
  • multiset<Elem> - мультимножество с сортировкой по критерию less<> (оператор <);
  • multiset<Elem,op> - мультимножество с сортировкой по критерию ор.

   
Существуют два варианта определения критерия сортировки.

  • В параметре шаблона, например:
      std::set<int,std::greater<int> > coll;
    

       
    В этом случае критерий сортировки является частью типа. Таким образом, система типов гарантирует, что объединение возможно
    только для контейнеров с одним критерием сортировки. Этот способ определения критерия сортировки является наиболее
    распространенным. Выражаясь точнее, во втором параметре передается тип критерия сортировки, а конкретный критерий -
    это объект функции, создаваемый в контейнере. Для этого конструктор контейнера вызывает конструктор по умолчанию типа
    критерия сортировки.

  • В параметре конструктора. В этом варианте можно определить тип для нескольких критериев сортировки с
    разными значениями или состояниями этих критериев. Такой подход удобен при формировании критериев сортировки на стадии
    выполнения, а также при использовании различающихся критериев сортировки, которые относятся к одному типу данных.

       
    Если критерий сортировки не указан, по умолчанию используется объект функции less<>, сортирующий элементы
    оператором <.

       Замечание.
    В системах, не поддерживающих значения по умолчанию для параметров шаблонов, критерий сортировки обычно является
    обязательным параметром:

      set<int,less<1nt> > coll;
    

   
Учтите, что критерий сортировки также используется при проверке элементов на равенство. При использовании критерия сортировки
по умолчанию проверка двух элементов на равенство реализуется так:

  if (! (elem1<elem2 || elem2<elem1) )

   
У такой реализации есть три достоинства:

  • она не требует передачи дополнительного аргумента (достаточно передать всего один аргумент - критерий сортировки);
  • при определении типа элемента не обязательно определять оператор ==;
  • в программе можно использовать расходящиеся определения равенства (то есть оператор == и проверка по критерию сортировки
    могут давать разные результаты), хотя это усложняет и запутывает программу.

   
С другой стороны, проверка на равенство в этом варианте занимает немного больше времени, поскольку для получения результата
приходится выполнять два сравнения. Впрочем, если первое подвыражение дает истинный результат, то второе подвыражение не
обрабатывается.

   
Полное имя типа для контейнера получается излишне сложным и громоздким, поэтому для него рекомендуется определить
псевдоним (то же самое полезно сделать и для определений итераторов):

  typedef std::set<int,std::greater<int> > IntSet;
  .    .    .    .    . 
  intSet coll;
  IntSet::iterator pos;

   
Конструктор, которому передается начало и конец интервала, может применяться для инициализации контейнера элементами контейнеров,
относящихся к другим типам (от массива до стандартного входного потока данных). За подробностями обращайтесь на 124 шаг.

   
На следующем шаге мы рассмотрим немодифицирующие операции над множествами и мультимножествами.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий