Шаг 168.
Библиотека STL. Контейнеры STL. Операции над множествами и мультимножествами. Пример использования мультимножеств

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

    Для мультимножеств программа предыдущего шага выглядит несколько иначе и выводит другие результаты:

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream>
#include <iterator>
#include <set>
#include <conio.h> //необходимо для getch()

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
using namespace std;

std::string ToRus(const std::string &in)
{
  char *buff = new char [in.length()+1];
  CharToOem(in.c_str(),buff);
  std::string out(buff);
  delete [] buff;
  return out;
}

int main(int argc, char* argv[])
{
  // Тип коллекции:
  //- дубликаты разрешены
  //- элементы типа int
  //- сортировка па убыванию

  typedef multiset<int,greater<int> > IntSet;
  IntSet coll1; // Пустое множество

  // Вставка элементов а произвольном порядке
  coll1.insert(4);
  coll1.insert(3);
  coll1.insert(5);
  coll1.insert(1);
  coll1.insert(6);
  coll1.insert(2);
  coll1.insert(5);

  // Перебор и вывод всех элементов 
  IntSet::iterator pos;
  cout << ToRus("Элементы мультимножества:\n");
  for (pos = coll1.begin();pos != coll1.end(); ++pos) { 
    cout << *pos << ' ';
  }
  cout << endl;

  // Повторная вставка значения 4 
  // и обработка возвращаемого значения 
  IntSet::iterator ipos = coll1.insert(4); 
  cout << ToRus("Число 4 вставлено ")
         << distance(coll1.begin(),ipos) + 1 
         << endl;

  // Присваивание элементов другому множеству, 
  // упорядоченному по возрастанию 
  multiset<int> coll2(coll1.begin(),coll1.end());

  // Вывод всех элементов копии 
  cout << ToRus("Элементы копии множества:\n");
  copy (coll2.begin(), coll2.end(),
        ostream_iterator<int>(cout," ")); 
  cout << endl;

  // Удаление всех элементов до элемента со значением 3 
  coll2.erase(coll2.begin(),coll2.find(3));

  // Удаление всех элементов со значением 5
  int num;
  num = coll2.erase(5);
  cout << num << ToRus(" элемент(а) удален(о)") << endl;

  // Вывод всех элементов
  cout << ToRus("Элементы множества после удаления:\n");
  copy (coll2.begin(),coll2.end(),
        ostream_iterator<int>(cout," ")); 
  cout << endl;


  getch();
  return 0;
}
//---------------------------------------------------------------------------
Текст этого примера можно взять здесь.

    Тип set везде заменен типом multiset. Кроме того, возвращаемое значение функции insert() обрабатывается иначе:

  IntSet::iterator ipos = coll1.insert(4); 
  cout << ToRus("Число 4 вставлено ")
         << distance(coll1.begin(),ipos) + 1 
         << endl;

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

    Результат выполнения программы выглядит так:


Рис.1. Результат выполнения приложения

    На следующем шаге мы рассмотрим пример определения критерия сортировки на стадии выполнения.




Предыдущий шаг Содержание Следующий шаг