На этом шаге мы приведем пример использования алгоритмов слияния.
В следующем примере сравниваются алгоритмы, комбинирующие элементы двух упорядоченных исходных интервалов, демонстрируются принципы их работы и различия между ними:
//--------------------------------------------------------------------------- #include <vcl.h> #include <iterator> #include "algostuff.hpp" #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 c1[] = { 1, 2, 2, 4, 6, 7, 7, 9 }; int num1 = sizeof(c1) / sizeof(int); int c2[] = { 2, 2, 2, 3, 6, 6, 8, 9 }; int num2 = sizeof(c2) / sizeof(int); // Вывод исходных интервалов cout << ToRus("Интервал c1:\n"); copy (c1, c1+num1, ostream_iterator<int>(cout," ")); cout << endl; cout << ToRus("Интервал c2:\n"); copy (c2, c2+num2, ostream_iterator<int>(cout," ")); cout << '\n' << endl; // Суммирование интервалов алгоритмом merge() cout << ToRus("Суммирование интервалов алгоритмом merge():\n"); merge (c1, c1+num1, c2, c2+num2, ostream_iterator<int>(cout," ")); cout << endl; // Объединение интервалов алгоритмом set_union() cout << ToRus("Объединение интервалов алгоритмом set_union():\n"); cout << "set_union(): "; set_union (c1, c1+num1, c2, c2+num2, ostream_iterator<int>(cout," ")); cout << endl; // Пересечение интервалов алгоритмом set_intersection() cout << ToRus("Пересечение интервалов алгоритмом set_intersection():\n"); set_intersection (c1, c1+num1, c2, c2+num2, ostream_iterator<int>(cout," ")); cout << endl; // Определение элементов первого интервала, // не входящих во второй интервал, алгоритмом set_difference() cout << ToRus("Определение элементов первого интервала,\n"); cout << ToRus("не входящих во второй интервал, алгоритмом set_difference():\n"); set_difference (c1, c1+num1, c2, c2+num2, ostream_iterator<int>(cout," ")); cout << endl; // Вычисление разности интервалов алгоритмом set_symmetric_difference() cout << ToRus("Вычисление разности интервалов алгоритмом\n set_symmetric_difference():\n"); set_symmetric_difference (c1, c1+num1, c2, c2+num2, ostream_iterator<int>(cout," ")); cout << endl; getch(); return 0; } //---------------------------------------------------------------------------
Результат выполнения программы выглядит так:
Рис.1. Результат работы приложения
На следующем шаге мы рассмотрим слияние смежных упорядоченных интервалов.