std::map有一个insert方法,它采用一个"提示"迭代器,如果提示正确,将把log(n)的插入时间减少到恒定时间.很明显这是如何工作的,因为容器可以确保新添加的项具有小于提示的键并且具有比提示之前的项更大的键.否则提示错误并执行正常插入.
std::unordered_map也有类似insert的提示功能.提示有什么作用?我不清楚如何使用另一个"提示"迭代器来加速哈希映射插入.
如果使用它,什么是适当的"提示".在std::map,通常通过调用lower_bound地图找到提示.
我在stackOverflow std :: map insert或std :: map find中遇到了以下问题 ?
为什么使用find()被认为低于lower_bound()+ key_comp()?
假设我有以下地图
map<int, int> myMap;
myMap[1]=1;
myMap[2]=3;
myMap[3]=5;
int key = xxx; //some value of interest.
int value = yyy;
Run Code Online (Sandbox Code Playgroud)
建议的答案是使用
map<int, int>::iterator itr = myMap.lower_bound(key);
if (itr != myMap.end() && !(myMap.key_comp()(key, itr->first)))
{
//key found.
// do processing for itr->second
//
}else {
//insert into the end position
myMap.insert (itr, map<int, int>::value_type(key, value));
}
Run Code Online (Sandbox Code Playgroud)
为什么它比以下更好?
map<int, int>::iterator itr = myMap.find(key);
if (itr != myMap.end())
{
//key found.
// …Run Code Online (Sandbox Code Playgroud) 是否可以在 Javascript Map中一步查找或添加元素?
我想一步完成以下操作(以避免两次寻找密钥的正确位置):
// get the value if the key exists, set a default value otherwise
let aValue = aMap.get(aKey)
if(aValue == null) {
aMap.set(aKey, aDefaultValue)
}
Run Code Online (Sandbox Code Playgroud)
相反,我只想搜索一次密钥。
在 C++ 中,可以使用std::map::insert()或std::map::lower_bound()
在 JavaScript 中,代码可能如下所示:
let iterator = aMap.getPosition(aKey)
let aValue = aMap.getValue(iterator)
if(aValue == null)
{
aMap.setWithHint(aKey, aValue, iterator)
}
Run Code Online (Sandbox Code Playgroud)
或者
let aValue = aMap.getOrSet(aKey, aDefaultValue)
Run Code Online (Sandbox Code Playgroud)
我认为这是不可能的,但我想确保我是正确的。我也有兴趣知道为什么这是不可能的,尽管它是一个重要的功能。