На этом шаге мы рассмотрим пример использования мультимножеств.
Для мультимножеств программа предыдущего шага выглядит несколько иначе и выводит другие результаты:
//--------------------------------------------------------------------------- #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. Результат выполнения приложения
На следующем шаге мы рассмотрим пример определения критерия сортировки на стадии выполнения.