I have a stream of pairs of elements of type T, and want to insert individual T's uniquely into a container and convert the pairs to a pair of indices into this container.
Boost.MultiIndex seems to be cut out exactly for this job, but I not sure about how to obtain the indices or stability of them on addition:
Take,
namespace bmi = boost::multi_index;
typedef bmi::multi_index_container< T, bmi::indexed_by
< bmi::hashed_unique< bmi::identity<T> >
, bmi::random_access<>
>> MIC;
MIC elements;
std::vector<std::pair<int,int>> pairs;
for( const std::pair<T,T>& pt : stream ) {
auto t1 = elements.insert(pt.first).first; // not all insertions are successful of course
auto t2 = elements.insert(pt.second).first;
pairs.insert( index_of(t1), index_of(t2) );
}
// where index_of() is
auto index_of = [&]( MIC::const_iterator i ) {
return elements.project<1>(i) - elements.get<1>().begin();
}
(1) Is the implementation of index_of() correct? (or better, is there something like this already for random access indices)
(2) Is the way they are used in above loop stable, where elements are inserted after an index is obtained?