C++ 何时将节点类型与std::map::insert一起使用?
我已经习惯了现有的C++ 何时将节点类型与std::map::insert一起使用?,c++,stl,iterator,containers,c++17,C++,Stl,Iterator,Containers,C++17,我已经习惯了现有的std::map 插入元素返回描述成功插入的布尔值, 以及迭代器,以确定插入元素的位置 template< class P > std::pair<iterator,bool> insert( P&& value ); //(since C++11) 我试图查找什么是节点类型,但它主要是未指定的: template</*unspecified*/> class /*unspecified*/ 模板 类别/*未指定*/ 为
std::map
插入元素返回描述成功插入的布尔值,
以及迭代器,以确定插入元素的位置
template< class P >
std::pair<iterator,bool> insert( P&& value ); //(since C++11)
我试图查找什么是节点类型
,但它主要是未指定的:
template</*unspecified*/>
class /*unspecified*/
模板
类别/*未指定*/
为什么在C++17中添加了此函数,我什么时候在旧调用中使用它?您可以使用其函数从
std::map
获取节点。然后,您可以将该节点放入另一个贴图(或在更改其关键点后放入同一个贴图)
1) 取消链接包含按位置指向的元素的节点
并返回拥有它的节点句柄2) 如果容器有 元素的键等效于
x
,将取消包含
元素,并返回一个拥有
信息技术否则,返回一个空的节点句柄
在这两种情况下,都不会复制或移动任何图元,只会复制或移动内部图元
容器节点的指针被重新导入(可能发生重新平衡,
与erase()一样,提取节点会使迭代器失效
提取元素。指向提取元素的指针和引用
保持有效,但在元素归节点所有时不能使用
句柄:如果将元素插入到
容器
例如:
map<int, string> m{{1,”mango”}, {2,”papaya”}, {3,”guava”}};
auto nh = m.extract(2);
nh.key() = 4;
m.insert(move(nh));
// m == {{1,”mango”}, {3,”guava”}, {4,”papaya”}}
map m{{1,“芒果”}、{2,“番木瓜”}、{3,“番石榴”};
自动nh=m.提取(2);
nh.key()=4;
m、 插入(移动(nh));
//m=={{1,“芒果”}、{3,“番石榴”}、{4,“番木瓜”}
不仅仅是
std::map
,所有关联和无序关联容器中都添加了类似的函数。标准中对其进行了解释
节点句柄是从关联容器(23.2.4)或无序关联容器(23.2.5)接受单个元素所有权的对象。它可以用于将该所有权转移到另一个容器
具有兼容的节点。具有兼容节点的容器具有相同的节点句柄类型
上一节后面的表格显示了具有兼容节点的容器
节点句柄接口允许您将元素(节点)从一个容器传输到另一个(兼容)容器,而无需复制/移动元素。相反,容器维护的单个内部节点作为一个整体进行传输
当处理包含不可复制、不可移动类型的容器时,这是必需的
node_type extract(const_iterator position); (1) (since C++17)
node_type extract(const key_type& x); (2) (since C++17)
map<int, string> m{{1,”mango”}, {2,”papaya”}, {3,”guava”}};
auto nh = m.extract(2);
nh.key() = 4;
m.insert(move(nh));
// m == {{1,”mango”}, {3,”guava”}, {4,”papaya”}}