Racket是否有双向散列映射?
也就是说,哈希映射可以在恒定时间内,给一个键并查找值,或者给出值并查找键?我很高兴看起来像这样的API:
#lang racket
(define my-map (bidirectional-hash '(key1 val1) '(key2 val2)))
(bidirectional-hash-ref my-map 'key 'key1) ; => val1
(bidirectional-hash-ref my-map 'val 'val2) ; => key2
Run Code Online (Sandbox Code Playgroud)
符号key并val告诉哈希映射它被赋予val,并寻找一个键,或给一个键,并寻找一个val.在这两种情况下,我希望在恒定的O(1)时间内完成.
我知道你可以通过使用两个彼此反转的哈希表来实现这一点,但我想要一个构建在Racket(或现有库)中的结构.
我正在尝试为C++中的枚举创建一个简单的双向查找工具.我的单向查找工作正常......
enum MyEnum
{
One,
Two,
Three
};
const boost::unordered_map<MyEnum,std::string> MyEnumMap = map_list_of
(One, "One")
(Two, "Two")
(Three, "Three");
Run Code Online (Sandbox Code Playgroud)
然后看看
MyEnumMap.at(One)
Run Code Online (Sandbox Code Playgroud)
这有效,但它只允许基于密钥的查找.我想使用一个双向查找容器,如boost:bimap,以便根据值和键进行简单的反向查找.尽管如此,map_list_of似乎与boost :: bimap不兼容.
首先,我是否还应该使用带有boost :: bimap的map_list_of,还是需要另一种类型?
这些地图都是基本的(枚举,字符串)类型.
第二,有没有一种方法我仍然可以像上面那样以简单的方式将地图定义为const?我试图让这个更容易更新和维护,而不会进入太多额外的typedef等.非常感谢您的见解.
我承认这个问题在此之前已经被问到,但是现在是4年前,我敢于要求更新:
我需要一种方法来将一个元组/对添加到容器中并有效地搜索左侧和右侧元素.
升压具有bimap和multi_index该做的正是我想要的,但我不知道什么是纯现代C++推荐的替代方案- 11/14如果你不希望引入的依赖性提高(无论何种原因).
链接中的一个答案表明不需要s.th. 由于透明的比较器,更像是一个bimap .接受的答案表明将std::maps与key1- > key2和key2- > 组合在一起的实现key1.
我真的不知道透明比较器如何帮助我,我只是好奇是否有一些这是你应该怎么做以及为什么 - 解决方案.你能提供一些提示/链接吗?
我正在使用Eclipse,并且我已经添加了google-collect.1.0-rc2.jar作为引用的库.但不知怎的,这仍然无效:
import com.google.common.collect.HashBiMap;
public class Odp {
//...
HashBiMap<Character, Integer> charOcc =
HashBiMap<Character, Integer>.create();
}
Run Code Online (Sandbox Code Playgroud)
Eclipse给出以下错误:
此行有多个标记
- HashBiMap无法解析
- Character.Integer无法解析
- 令牌",","."上的语法错误.预期
- 令牌"."上的语法错误,删除此令牌
- 对于类Odp,方法create()未定义
我究竟做错了什么?
其他谷歌的东西,如乔纳,工作得很好.(但乔伊纳不是通用的.)
我正在努力提高程序的性能,该程序同时使用Boost Graph Library和boost::bimap.分析显示大部分时间都花在内存分配和释放上.使adjacency_list图库的类boost::fast_pool_allocator显着使用改进的性能.剩下的大部分内存分配都会出现boost::bimap,所以我想尝试在那里使用自定义分配器.该文件说,你可以指定分配为bimap中的最后一个模板参数,但它并没有说什么类型的模板参数分配器本身应该是.例如,对于类型X和Y,在
boost::bimap<set_of<X>, set_of<Y>, boost::fast_pool_allocator<Z> >
Run Code Online (Sandbox Code Playgroud)
应该填写什么Z?
就像我们现在一样,有BiMap和multiMap的概念,但有一个multiBiMap吗?所以我的意思是什么呢.在multiMap中,您在K和V之间具有一对多关系,单个键可以与多个值相关联,因此也就是名称.在双向地图中你有K,V对是双向的意思,你也可以获得V,K关系.就像有两个常规地图但同步.我需要一个双向多图,你可以将这两个概念结合起来.
STL映射“[]”运算符可以插入新条目或修改现有条目。
map<string, string> myMap;
myMap["key1"] = "value1";
myMap["key1"] = "value2";
Run Code Online (Sandbox Code Playgroud)
我正在用boost::bimap重写一些由STL映射实现的代码。有没有简单的方法来保持STL“[]”行为?我发现我必须编写以下 7 行代码来替换原来的 STL 地图代码(1 行!)。
bimap<string, string>::left_iterator itr = myBimap.left.find("key1");
if (itr != myBimap.left.end()) {
myBimap.left.replace_data(itr, "value2");
}
else {
myBimap.insert(bimap<string, string>::value_type("key1", "value2"));
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有像 boost::bimap::insert_or_modify() 这样的实用函数。
我尝试将std :: map的元素复制到boost :: bimap中.我无法让std :: copy工作(boost文档似乎表明bimap应该与std :: copy兼容).
我尝试了以下方法:
std::map<K, T> curves;
boost::bimap<boost::bimaps::set_of<K>,
boost::bimaps::multiset_of<T>> m_curves;
... // some initialisation of curves
std::copy(curves.begin(), curves.end(), std::inserter(m_curves,
m_curves.end())); // This fails
m_curves.insert(curves.begin(), curves.end()); // This fails too !
Run Code Online (Sandbox Code Playgroud)
错误消息很长,从以下开始:
1>C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xutility(2266) : error C2679: binary '=' : no operator found which takes a right-hand operand of type 'const std::pair<_Ty1,_Ty2>' (or there is no acceptable conversion)
1> with
1> [
1> _Ty1=const K,
1> _Ty2=std::string
1> ]
1> C:\Program …Run Code Online (Sandbox Code Playgroud) 在我的代码中,我想要一个
HashBiMap<T1, HashSet<T2>> bimap;
Run Code Online (Sandbox Code Playgroud)
在bimap中改变值是否可以?当我使用时bimap.inverse(),它hashCode()是否会导致与包含可变键的HashMap相关的相同问题?
我最近一直试图实现一个简单的遗传算法.我需要使用一个存储成对的可逆地图(Character,4 bits).我选择了番石榴BiMap来完成这项任务.但是由于int我选择用于位存储的数组,测试不会通过.
是int[]一种原始类型?使用一个Vector或List一个整数是否适合这项任务?