C++ (Qt)using TPair = std::pair<int, int>; void AddRange( std::vector<TPair> & dst, const TPair & p ){...}
C++ (Qt)#include <algorithm> using Interval = ::std::pair< int, int >;using Intervals = ::std::vector< Interval >; // условие упорядочивания по значению начала диапазонаstruct IntLowerCompare { bool operator () ( const Interval & left, const Interval & right ){ return left.second + 1 < right.first; }}; // условие упорядочивания по значению конца диапазонаstruct IntUpperCompare { bool operator () ( const Interval & left, const Interval & right ){ return left.first + 1 < right.second; }}; // условие необходимости слиянияstruct IntMergeCondition { bool operator () ( const Interval & left, const Interval & right ){ return left.second + 1 >= right.first; }}; template < typename Intervals, typename Interval, typename LowerCompare, typename UpperCompare, typename MergeCondition >void add ( Intervals & intervals, const Interval & interval, LowerCompare lower_compare, UpperCompare upper_compare, MergeCondition merge_condition ){ // итератор для первого значения в коллекции с возможно пересекающимся интервалом auto lower_iter = ::std::lower_bound( ::std::begin( intervals ), ::std::end( intervals ), interval, lower_compare ); if ( lower_iter != ::std::end( intervals ) ) { // если есть пересечение if ( merge_condition( interval, *lower_iter ) ) { // итератор для последнего значения в коллекции с возможно пересекающимся интервалом auto upper_iter = ::std::upper_bound( ::std::begin( intervals ), ::std::end( intervals ), interval, upper_compare ); auto first_iter = lower_iter; auto last_iter = upper_iter == ::std::end( intervals ) ? lower_iter : upper_iter; // изменение пересекающегося lower_iter->first = ::std::min( first_iter->first, interval.first ); lower_iter->second= ::std::max( last_iter->second, interval.second ); // удаление лишних intervals.erase( ++first_iter, ++last_iter ); } else { // вставка в середину intervals.insert( lower_iter, interval ); } } else { // вставка в конец intervals.insert( lower_iter, interval ); }} int main ( int, char ** ){ Intervals intervals = {{1, 2}, {8, 9 }}; add( intervals, Interval{ -2, -1 }, IntLowerCompare{}, IntUpperCompare{}, IntMergeCondition{} ); add( intervals, Interval{ 5, 5 }, IntLowerCompare{}, IntUpperCompare{}, IntMergeCondition{} ); add( intervals, Interval{ 5, 7 }, IntLowerCompare{}, IntUpperCompare{}, IntMergeCondition{} ); add( intervals, Interval{ 3, 7 }, IntLowerCompare{}, IntUpperCompare{}, IntMergeCondition{} ); add( intervals, Interval{ 0, 10 }, IntLowerCompare{}, IntUpperCompare{}, IntMergeCondition{} ); add( intervals, Interval{ 11, 11 }, IntLowerCompare{}, IntUpperCompare{}, IntMergeCondition{} );}
C++ (Qt)auto it1 = std::lower_bound(beg, end, TPair(p.first, p.first));auto it2 = std::lower_bound(beg, end, TPair(p.second, p.second));