我有许多字符串及其等效的位集。我需要能够在两个方向上查找等效项,即“ str到bitset ”和“ bitset到str ”。我相信boost-bimap是适合此工作的容器。
我设法使它与字符串和整数一起使用,但是我的字符串/位集bimap无法编译。我正在将VS2019与最新的Boost版本一起使用。
#include <boost/bimap.hpp>
#include <string>
#include <iostream>
int main()
{
typedef boost::bimap<std::string, int> bimap_str_int_t;
bimap_str_int_t bimap1;
bimap1.insert(bimap_str_int_t::value_type("A", 1));
std::cout << bimap1.left.at("A") << '\n'; //prints 1
std::cout << bimap1.right.at(1) << '\n'; // prints A
}
#include <boost/bimap.hpp>
#include <string>
#include <iostream>
#include <bitset>
int main()
{
typedef std::bitset<3> bitset_t;
typedef boost::bimap<std::string, bitset_t> bimap_str_bitset_t;
bimap_str_bitset_t bimap2;
bitset_t bits{ "010" };
bimap2.insert(bimap_str_bitset_t::value_type("A", bits));
std::cout << bimap2.left.at("A") << '\n';
std::cout << bimap2.right.at(bits) << '\n';
}
位集示例创建以下编译器错误:
boost_test.cpp(20):消息:请参见对正在编译的类模板实例化'boost :: bimaps :: bimap'的引用
我不确定如何解决此问题,将不胜感激任何提示。
答案 0 :(得分:1)
问题是std::bitset
没有operator<
-任何类似STL的有序集合的要求之一。
要解决此问题,您需要提供比较功能-这是您可以尝试的一种方法:
#include <boost/bimap.hpp>
#include <string>
#include <iostream>
#include <bitset>
typedef std::bitset<3> bitset_t;
struct compare_bitset {
bool operator()(const bitset_t& x, const bitset_t& y) const {
return x.to_ulong() < y.to_ulong();
}
};
int main()
{
using bitset_set = boost::bimaps::set_of<bitset_t, compare_bitset>;
typedef boost::bimap < std::string, bitset_set> bimap_str_bitset_t;
bimap_str_bitset_t bimap2;
bitset_t bits{ "010" };
bimap2.insert(bimap_str_bitset_t::value_type("A", bits));
std::cout << bimap2.left.at("A") << '\n';
std::cout << bimap2.right.at(bits) << '\n';
}