我有这样的bimap:
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有什么期望?
答案 0 :(得分:23)
我使用以下&#34;工厂功能&#34;它采用支撑初始化列表并返回boost::bimap
:
template <typename L, typename R>
boost::bimap<L, R>
makeBimap(std::initializer_list<typename boost::bimap<L, R>::value_type> list)
{
return boost::bimap<L, R>(list.begin(), list.end());
}
用法:
auto myBimap = makeBimap<int, int>({{1, 2}, {3, 4}, {5, 6}});
答案 1 :(得分:12)
答案 2 :(得分:8)
迭代器的开始/结束应该是一系列bimap值。
boost::bimap< A, B>::value_type
bimap值很像std :: pair,可以用{a1, b1}
语法初始化。它们的向量似乎也可以工作,它为构造函数提供了可用的迭代器。
好的,这是一个为我编译和运行的例子(gcc 4.8.2 --std = c ++ 11)
#include <vector>
#include <boost/bimap.hpp>
using namespace std;
int main() {
typedef boost::bimap< int, int > MyBimap;
std::vector<MyBimap::value_type > v{{1, 2}, {3, 4}, {5, 6}};
MyBimap M(v.begin(),v.end());
std::cout << "The size is " << M.size()
<< std::endl;
std::cout << "An entry is 1:" << M.left.at(1)
<< std::endl;
}
答案 3 :(得分:2)
这会留下要清理的矢量,这在某些情况下可能是一个问题。这里有一个简短的帮助类,可以解决您的问题。由于类实例是临时的,因此无论在何处使用它都会立即清理。这基于https://stackoverflow.com/a/1730798/3103767
// helper for bimap init (simple, lightweight version of boost::assign)
template <typename T, typename U>
class create_bimap
{
typedef boost::bimap< T, U > bimap_type;
typedef typename bimap_type::value_type value_type;
private:
boost::bimap<T, U> m_map;
public:
create_bimap(const T& left, const U& right)
{
m_map.insert( value_type(left, right) );
}
create_bimap<T, U>& operator()(const T& left, const U& right)
{
m_map.insert( value_type(left, right) );
return *this;
}
operator boost::bimap<T, U>()
{
return m_map;
}
};
使用如下:
boost::bimap<string,int> myMap = create_bimap<string,int>
("c",1)
("b",2)
("a",3);