Со ссылкой на мой ранее заданный вопрос об интерфейсе карт ассоциативных свойств boost :: bimaps и boost Вот, Я хочу использовать вспомогательные функции Put и Get для моего bimap.
Со ссылкой на пример кода Вот, Я попытался добавить следующее, и я получил длинную ошибку компиляции для утверждения не удалось … Вот код:
#include <boost/bimap.hpp>
#include <boost/property_map/property_map.hpp>
#include <boost/bimap/property_map/set_support.hpp>
#include <iostream>
using namespace boost;
int main()
{
typedef int vertex_descriptor_t;
typedef boost::bimaps::bimap< vertex_descriptor_t, size_t > vd_idx_bimap_t;
typedef boost::associative_property_map<vd_idx_bimap_t::left_map> asso_vd_idx_bimap_t;
// define bimap
vd_idx_bimap_t my_bimap;
asso_vd_idx_bimap_t my_asso_bimap(my_bimap.left);
typedef typename vd_idx_bimap_t::value_type value_type;
my_bimap.insert( value_type( 1, 100 ) );
// print bimap
for(auto t = my_bimap.left.begin(); t != my_bimap.left.end(); ++t)
std::cout << t->first << " " << t->second << "\n";
int z = 1;
std::cout << "value = " << get ( my_bimap.left, z ) << std::endl; // prints correctly value = 100// ERROR here .
boost::put( my_asso_bimap, 2, 19 );
}
Это дает ошибку как: (длинный список. Но я только что поместил фрагмент)
cannot convert âboost::bimaps::detail::non_mutable_data_unique_map_view_access<Derived, Tag, BimapType>::operator[](const CompatibleKey&)::BIMAP_STATIC_ERROR__OPERATOR_BRACKET_IS_NOT_SUPPORTED360::assert_arg<long unsigned int>()â (type âmpl_::failed************ (boost::bimaps::detai
Есть также одна ошибка, которая дает мне ошибку в строке номер 364 файла (property_map.hpp) в boost
put(const put_get_helper<Reference, PropertyMap>& pa, K k, const V& v)
{
static_cast<const PropertyMap&>(pa)[k] = v;
}
Я понимаю ошибку, что ассоциативная карта не может изменить данные, так как она ссылается на левый вид карты. но как мне использовать вспомогательные функции put и get?
Я могу использовать функции GET (my_bimap.left, z), но я не могу использовать функцию PUT. Я хотел использовать ассоциативную карту свойств для функций get и put для работы с фактическим bimap, чтобы мне не приходилось использовать insert (value_type ()) …
Я надеюсь, что я достаточно ясно для моей проблемы. Пожалуйста, предложите.
Как правило, вы не можете обновить записи BIMAP с помощью итераторов:
Отношения, хранящиеся в Bimap, в большинстве случаев не могут быть изменены напрямую итераторами, поскольку обе стороны используются в качестве ключей наборов на основе ключей. Когда итератор левого представления bimap разыменовывается, возвращаемый тип совместим с сигнатурой с помощью std :: pair< const A, const B>.
Итак, вот ваш ответ. Точно так же вы не могли
my_bimap.left[2] = 19;
Теперь, читая немного больше, я «подозреваю» следующее решение:
typedef bm::bimap< vertex_descriptor_t, bm::list_of<size_t> > vd_idx_bimap_t;
Отказ от ответственности: я не знаю о семантике, что это изменится (?), Но, по крайней мере, кажется, что поддерживает ссылки для записи. Ниже образец печатает
1 100
value = 100
1 100
2 42
Видеть это Жить на Колиру
#include <boost/bimap.hpp>
#include <boost/property_map/property_map.hpp>
#include <boost/bimap/property_map/set_support.hpp>
#include <boost/bimap/list_of.hpp>
#include <iostream>
using namespace boost;
int main()
{
typedef int vertex_descriptor_t;
namespace bm = boost::bimaps;
typedef bm::bimap< vertex_descriptor_t, bm::list_of<size_t> > vd_idx_bimap_t;
typedef boost::associative_property_map<vd_idx_bimap_t::left_map> asso_vd_idx_bimap_t;
// define bimap
vd_idx_bimap_t my_bimap;
asso_vd_idx_bimap_t my_asso_bimap(my_bimap.left);
typedef typename vd_idx_bimap_t::value_type value_type;
my_bimap.insert( value_type( 1, 100 ) );
// print bimap
for(auto t = my_bimap.left.begin(); t != my_bimap.left.end(); ++t)
std::cout << t->first << " " << t->second << "\n";
int z = 1;
std::cout << "value = " << get ( my_bimap.left, z ) << std::endl; // prints correctly value = 100
boost::put( my_asso_bimap, 2, 42 );
for(auto t = my_bimap.left.begin(); t != my_bimap.left.end(); ++t)
std::cout << t->first << " " << t->second << "\n";
}
Других решений пока нет …