Стандартный алгоритм std::copy
может использоваться для заполнения интервальных контейнеров из стандартных контейнеров интервальных или интервальных пар значений (сегментов). Поскольку интервалы не представляют элементы, а наборы, которые могут быть пустыми или содержать более одного элемента, использование std::копия
отличается от того, что мы знаем при использовании контейнеров элементов.
- Используйте
icl::inserter#include<boost/icl/iterator.hpp>
вместо std::inserter
для вызова вставок в контейнере целевого интервала. - <>add для создания
желаемых результатов агрегирования. Вы можете использовать
std::copy
с icl::adder
вместо icl::inserter
чтобы добиться этого.
.
#include <iostream>
#include <vector>
#include <algorithm>
#include <boost/icl/interval_map.hpp>
using namespace std;
using namespace boost;
using namespace boost::icl;
vector<pair<discrete_interval<int>, int> > make_segments()
{
vector<pair<discrete_interval<int>, int> > segment_vec;
segment_vec.push_back(make_pair(discrete_interval<int>::right_open(2,4), 1));
segment_vec.push_back(make_pair(discrete_interval<int>::right_open(4,5), 1));
segment_vec.push_back(make_pair(discrete_interval<int>::right_open(1,3), 1));
return segment_vec;
}
void show_segments(const vector<pair<discrete_interval<int>, int> >& segments)
{
vector<pair<discrete_interval<int>, int> >::const_iterator iter = segments.begin();
while(iter != segments.end())
{
cout << "(" << iter->first << "," << iter->second << ")";
++iter;
}
}
void std_copy()
{
vector<pair<discrete_interval<int>, int> > segments = make_segments();
cout << "input sequence: "; show_segments(segments); cout << "\n\n";
interval_map<int,int> segmap;
std::copy(segments.begin(), segments.end(),
icl::inserter(segmap, segmap.end()));
cout << "icl::inserting: " << segmap << endl;
segmap.clear();
std::copy(segments.begin(), segments.end(),
icl::adder(segmap, segmap.end()));
cout << "icl::adding : " << segmap << endl;
}
int main()
{
cout << ">> Interval Container Library: Example std_copy.cpp <<\n";
cout << "-----------------------------------------------------------\n";
cout << "Using std::copy to fill an interval_map:\n\n";
std_copy();
return 0;
}