我有一个像这样的双Map:
using MyBimap = boost::bimaps::bimap<
boost::bimaps::unordered_set_of<A>,
boost::bimaps::unordered_set_of<B>>;
我想从一个静态初始化器列表构造它,就像std::map
一样:
MyBimap map{{a1, b1}, {a2, b2}, {a3, b3}};
不幸的是,由于bimap
不支持初始化器列表,所以它不起作用,所以我尝试了一种变通方法。Boost的文档列出了以下构造函数:
bimap();
template< class InputIterator >
bimap(InputIterator first,InputIterator last);
bimap(const bimap &);
所以我试了第二个,像这样:
std::vector<std::pair<A,B>> v{{a1, b1}, {a2, b2}, {a3, b3}};
MyBimap map(v.begin(), v.end());
它也不起作用,文档没有明确说明这个构造函数需要什么样的迭代器,但显然它不仅仅是std::pair<A, B>
对象的迭代器,那么这个构造函数需要什么样的bimap呢?
4条答案
按热度按时间elcex8rz1#
我使用下面的"工厂函数",它接受一个带括号的初始化器列表,并返回一个
boost::bimap
:用法:
dfuffjeb2#
C++初学者在这里:可以使用boost::assign来生成初始化,我找到了这个解决方案here。
示例:
omjgkv6w3#
迭代器的开始/结束应该是针对一个双Map值序列的。
boost::bimap< A, B>::value_type
bimap值很像std::pair,可以用
{a1, b1}
语法初始化,它们的向量也可以工作,为构造函数提供可用的迭代器。好了,下面是一个为我编译和运行的示例(gcc 4.8.2 --std=c++11)
3wabscal4#
这就留下了一个需要清理的向量,在某些情况下这可能是一个问题。这里有一个简短的helper类,它也可以解决你的问题。由于类示例是临时的,无论在哪里使用它,它都会立即被清理。这是基于https://stackoverflow.com/a/1730798/3103767的
使用如下: