提问人:W.R. 提问时间:10/12/2019 最后编辑:W.R. 更新时间:10/12/2019 访问量:97
难以创建包含 std::bitset 的 Boost-Bimap
Struggling to create a Boost-Bimap containing std::bitset
问:
我有许多字符串及其等效位集。我需要能够在两个方向上查找等价物,即“str to bitset”和“bitset to str”。我相信boost-bimap将是这项工作的正确容器。
我设法让它与字符串和整数一起工作,但我的字符串/位集 bimap 无法编译。我正在使用带有最新提升版本的 VS2019。
整数示例有效:
#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';
}
bitset 示例创建以下编译器错误:
boost_test.cpp(20):消息:参见正在编译的类模板实例化“boost::bimaps::bimap”的参考
我不确定如何解决这个问题,非常感谢任何提示。
答:
1赞
Ayjay
10/12/2019
#1
问题是没有 - 任何类似 STL 的有序集合的要求之一。std::bitset
operator<
要解决此问题,您需要提供一个比较函数 - 您可以尝试以下一种方法:
#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';
}
评论
0赞
W.R.
10/12/2019
谢谢你@Ayjay,效果很好。感谢您的快速回复。出于好奇,这是我应该能够从错误消息中收集到的东西吗?
0赞
Ayjay
10/12/2019
我从您的程序中得到的编译错误的第一行是.老实说,我主要只是猜测这就是问题所在,因为我非常确定位集没有,并且知道这是任何有序集合的要求。好消息是,在C++20中,概念被添加到语言中,这应该大大改善编译错误,类似于error C2678: binary '<': no operator found which takes a left-hand operand of type 'const _Ty' (or there is no acceptable conversion) with [ _Ty=std::bitset<3>]
operator<
Error: std::bitset<3> does not model Comparable
0赞
W.R.
10/12/2019
谢谢你的澄清。我能问一下你用的是哪个编译器吗?
0赞
Ayjay
10/14/2019
Visual Studio 2019
评论