在番石榴是否可能,
要BiMap对密钥值和多个值进行反向查找?确切地说,我有密钥和相应的多个值,我想从一个值获取密钥.
要存储多个值LinkedHashMap?确切地说,我想以某种顺序存储,键 - 多个值,因此我可以在列表中获得关键位置.
我正在回顾Googles Guava API的功能,我遇到了一个我在"真实世界编程"体验中没有看到过的数据结构,即BiMap.对于给定值,这种构造的唯一好处是能够快速检索密钥吗?是否存在使用BiMap最佳表达解决方案的问题?
我有以下代码:
wxString getColorName(const wxColour& color)
{
typedef ColorComboBox::ColorMap::right_const_iterator ConstColorIterator;
ColorComboBox::ColorMap colorMap = ColorComboBox::getDefaultChoices();
ConstColorIterator it = colorMap.right.find(color);
return it != colorMap.right.end() ? it->second :
ColorComboBox::CUSTOM_COLOR;
}
Run Code Online (Sandbox Code Playgroud)
其中定义了ColorMap
typedef boost::bimaps::bimap \
<wxString, boost::bimaps::vector_of<wxColour> > \
ColorMap;
Run Code Online (Sandbox Code Playgroud)
我一直得到一个很长的模板错误,基本上说找不到查找功能.然而
ColorMap::left_const_iterator it = choices_.left.find(GetValue());
Run Code Online (Sandbox Code Playgroud)
编译好.
我有一个预感,find函数只在某些集合类型的bimap中定义.我不能使用set_of wxColours,因为wxColour无法比较.(这甚至意味着什么?)我也尝试将集合类型更改为list_of,但这也不起作用.我使用bimap的全部意义在于,无论哪种方式,我都能找到价值观.我使用了错误的容器吗?是否有另一种我可以用于wxColour的集合类型,它允许我使用find函数?
编辑: 我最终创建了自己的容器类.
我在编译boost.bimap库时遇到问题.我的测试程序是一个空白的主函数,只有一个include指令(如#include <boost/bimap.hpp>).经过一些调查后,我发现预处理器已经从头文件中做了一些有趣的构造,如:
struct A { struct B{}; struct B; };
Run Code Online (Sandbox Code Playgroud)
我不知道这是否正确,但gcc接受它,而clang和icc则不接受.谁是对的,我该怎么做才能用bimap库编译程序?不幸的是,我不能在这种情况下使用gcc.