boost::bimap не принимает vector_of

typedef boost::bimap<boost::bimaps::vector_of<int>, boost::bimaps::vector_of<float> > bimap_t;
bimap_t mp;
mp.left.insert(bimap_t::left_value_type(2, 2.0f));

Почему это не работает? и выдает ошибку компилятора на insert(). Он не может найти insert(), который принимает bimap_t::left_value_type в качестве аргумента.

Однако boost::bimap<boost::bimaps::set_of<int>, boost::bimaps::vector_of<float> > работает. похоже, что левое не может быть вектором. но поскольку он двунаправленный, это не должно иметь значения


person Neel Basu    schedule 03.05.2013    source источник


Ответы (1)


Я никогда раньше не использовал Boost.Bimap, но, просматривая документацию, кажется, что типы представлений left и right и, соответственно, функции-члены, которые вы можете использовать, зависят от коллекций, которые вы используете в качестве параметров шаблона. Вы можете увидеть здесь методы, которые вы можете использовать с представлением vector_of. Вы можете использовать:

mp.left.insert(mp.left.end(), bimap_t::left_value_type(2,2.0f));
mp.left.push_back(bimap_t::left_value_type(2,2.0f));

Вы также можете использовать:

mp.left.push_front(bimap_t::left_value_type(2,2.0f));

но это не рекомендуется по соображениям производительности.

PS: Если вы используете bimap<boost::bimaps::set_of<int>, boost::bimaps::vector_of<float> >, ваш insert будет работать с левым видом, но не с правым.

person user2349552    schedule 04.05.2013
comment
Хм, тогда каков общий способ вставки? если это set_of, мне придется использовать insert, но если это vector_of, мне нужно push_back или передать end(). и чтобы сделать этот общий, мне понадобятся проверки типа компиляции, такие как enable_if, которые будут слишком сложными - person Neel Basu; 04.05.2013
comment
insert(Iterator, ValueType) работает со всеми представлениями, которые можно вставлять. Но если вы используете map.end() с представлением set_of, вы получите худшую производительность, чем если бы вы использовали итератор, который предшествовал точке вставки (O(log(N)) против O(1)). Я считаю, что это причина, по которой он не такой общий, как вы хотите, вы должны выбрать комбинацию растровых изображений, которая соответствует вашим требованиям к производительности, а затем использовать методы, разрешенные в этой комбинации. - person user2349552; 04.05.2013
comment
Я изменил комментарий в начале вопроса, он более точно отражает мой уровень знаний о библиотеке. Вероятно, вам следует дождаться более достоверного ответа. - person user2349552; 04.05.2013