Пересечение между различными значениями из boost :: bimap

Я пытаюсь использовать boost :: bimap для одного из моих требований. Ниже приведен пример кода

typedef bimap<
multiset_of< string >,
multiset_of< string >,
set_of_relation<>
> bm_type;

bm_type bm;

assign::insert( bm )

( "John" , string("lazarus" ) )
( "Peter", string("vinicius") )
( "Peter", string("test") )
( "Simon", string("vinicius") )
( "John", string("viniciusa") )
( "John", string("vinicius") )

Я хотел бы сделать что-то, как найти подходящие значения для Джона & Петр, другими словами пересечение между значениями для Джона & Петр для бывших: в этом случае это будет («Vinicius»). Может ли кто-нибудь представить это?

1

Решение

Вот что я придумал изначально:

template <typename Value = std::string, typename Bimap, typename Key>
std::set<Value> projection(Bimap const& bm, Key const& key)
{
std::set<Value> p;
auto range  = bm.left.equal_range(key);
auto values = boost::make_iterator_range(range.first, range.second);

for (auto& relation : values)
p.insert(relation.template get<boost::bimaps::member_at::right>());

return p;
}

auto john  = projection(bm, "John");
auto peter = projection(bm, "Peter");

std::multiset<std::string> intersection;
std::set_intersection(
john.begin(), john.end(),
peter.begin(), peter.end(),
inserter(intersection, intersection.end())
);

Я думаю, что это может быть более эффективным. Поэтому я попытался заменить проекцию на лету с помощью адаптеров Boost Range:

struct GetRightMember
{
template <typename> struct result { typedef std::string type; };

template <typename T>
std::string operator()(T const& v) const {
return v.template get<boost::bimaps::member_at::right>();
}
};

const GetRightMember getright;
std::cout << "Intersection: ";

// WARNING: broken: ranges not sorted
boost::set_intersection(
bm.left.equal_range("John")  | transformed(getright),
bm.left.equal_range("Peter") | transformed(getright),
std::ostream_iterator<std::string>(std::cout, " "));

К сожалению это не работает — предположительно потому, что преобразованные диапазоны не отсортированы.

Так что я бы остановился на более подробной версии (или пересмотрел мой выбор структуры данных). Видеть это Жить на Колиру

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]