template_hint在map中有什么用途
What is the use of emplace_hint in map?
我知道map::template_hint用于将键、值对放置在映射中的指定位置,但最终会对映射进行排序,所以将其放置在某个位置有什么意义?例如,当我运行以下代码时:
#include <iostream>
#include <map>
#include <unordered_map>
int main()
{
std::map<char, int> mymap;
auto it = mymap.end();
std::unordered_map<char, int> mymap2;
it = mymap.emplace_hint(it, 'b', 10);
mymap.emplace_hint(it, 'z', 12);
mymap.emplace_hint(mymap.end(), 'a', 14);
mymap.emplace_hint(mymap.end(), 'c', 10);
auto it2 = mymap2.end();
it2 = mymap2.emplace_hint(it2, 'b', 10);
mymap2.emplace_hint(it2, 'z', 12);
mymap2.emplace_hint(mymap2.end(), 'a', 14);
mymap2.emplace_hint(mymap2.end(), 'c', 10);
std::cout << "mymap contains:";
for (auto& x : mymap)
std::cout << " [" << x.first << ':' << x.second << ']';
std::cout << 'n';
for(auto& y :mymap2)
std::cout << " [" << y.first << ':' << y.second << ']';
char c;
std::cin >> c;
return 0;
}
它给了我这个o/p:
mymap contains: [a:14] [b:10] [c:10] [z:12]
[z:12] [b:10] [a:14] [c:10]
假设您只想在键还不存在的情况下将元素插入到映射中。当然,您可以只调用insert
,但进一步假设该操作是昂贵的或不可逆的(例如,从不可复制的对象移动)。
在这种情况下,需要将查找与插入分离。这就是提示的作用,与lower_bound
:一起使用
auto it = m.lower_bound(key);
if (it != m.end() && it->first == key) {
// key already exists
} else {
m.insert(it, std::make_pair(key, compute_expensively()));
// or:
m.emplace_hint(it, key, compute_expensively());
}
诀窍是,lower_bound
返回迭代器,如果键在映射中,则它将所在的位置,而不管它是否真的在映射中。如果提示正确,则提示插入的时间复杂度是恒定的。
使用不正确的迭代器(即没有作为给定键的下界获得的迭代者)进行暗示插入是没有意义的。
请注意,提示插入仅适用于排序的关联容器。无序容器也提供了这些重载,但它们没有效果,因为没有办法为无序容器获得有用的提示。
我知道map::template_hint用于将键、值对放置在映射中的指定位置
不,不是。
正如你所说,你自己无法控制元素的位置。地图决定了这一点。
这个提示是告诉编译器你认为映射将决定把它放在哪里,这样映射就不必花那么长时间自己弄清楚了。
例如,如果您已经知道(因为这是您的程序!)某个新元素肯定会出现在映射的"起点",那么您可以将这些知识传递到容器上。然后它只需要检查你是否正确,而不是扫描整棵树,最终得出结论。
如果你的提示是错误的,这不会改变元素的最终位置,但你会给地图更多的工作要做。
相关文章:
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- map<string, int> m= {}; 在C++中是什么意思?
- 创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- 什么是 Direct3D 12.0 上的"Map Default Buffer"?
- freq_table[field_pm_value] = map<string, int>(); 是什么意思?
- map<int,int>的*迭代器是什么?它不是pair<int,int>
- 方括号在"map <string, int> instance[numberFeatures];"中是什么意思
- 将强制转换运算符重载到 std::map 的正确语法是什么
- 在内存使用方面,c++ 中的 map 和 unordered_map 之间有什么区别吗?
- 什么是 Python 的 map(int,input().split()) 的 C++ 等价物
- 什么算作 std::map 的"write"?
- 这些会做什么(映射[x] [y] = 2;,map [x] [y] = 3;,以及map [x] [y] = 4;在下面
- STD :: MAP的基础结构是什么
- 访问std::map中元素的最有效方法是什么
- 添加和初始化新std::map元素的最有效方法是什么
- template_hint在map中有什么用途
- 有什么理由在 C++17 中使用 std::map::emplace() 而不是 try_emplace() 吗?
- g++ 命令中".map"文件有什么用?
- std::set 和 std::map 有什么区别
- C# 在<map>C++中相当于什么?