C++17下的map提供了如下接口:
- emplace( Args&&... args ),原位构造元素,将参数
args...转发给构造函数并插入生成元素
- emplace_hint( const_iterator hint, Args&&... args ) 原位构造元素,插入新元素到容器中尽可能接近于恰在
hint
前的位置 - try_emplace(const key_type& k, Args&&... args)
try_emplace(key_type&& k, Args&&... args)
try_emplace(const_iterator hint, const key_type& k, Args&&... args)
try_emplace(const_iterator hint, key_type&& k, Args&&... args)
若键不存在则原位插入,若键存在则不做任何事 -
extract( const_iterator position )
extract( const key_type& x ) 从另一容器释出结点
-
merge(std::map<Key, T, C2, Allocator>& source)
merge(std::map<Key, T, C2, Allocator>&& source)
merge(std::multimap<Key, T, C2, Allocator>& source)
merge(std::multimap<Key, T, C2, Allocator>&& source)
从另一容器接合结点 -
insert_or_assign(const key_type& k, M&& obj)
insert_or_assign(key_type&& k, M&& obj)
insert_or_assign(const_iterator hint, const key_type& k, M&& obj)
insert_or_assign(const_iterator hint, key_type&& k, M&& obj)
插入元素,或若关键已存在则赋值给当前元素
例子如下:
map<int, int> myMap;
auto[iter, bSuccess] = myMap.emplace(1,2);
auto[newIter, bNewSuccess] = myMap.emplace(1, 2);
myMap.emplace_hint(myMap.begin(), 2, 3);
上面的第二句等同于std:make_pair<int, int>(1, 2),即等同于将键为1,值为2的键值对插入myMap ,等同于如下代码:
map<int, int> myMap{std::make_pair(1,2)};
或
map<int, int> myMap{{1,2}};
或
map<int, int> myMap;
myMap[1] = 2;
auto[iter, bSuccess] 中的iter表示插入键值对的位置,bSuccess表示是否插入成功,此时bSuccess应该为true。由于第2句代码已经插入了1,2,则第3句代码bNewSuccess应为false。
emplace_hint很简单,即使提供一个插入的迭代器,在指定的迭代器位置插入。
另外下面链接也很不错:STL常用操作:map_zhuikefeng的博客-CSDN博客