Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 何时将节点类型与std::map::insert一起使用?_C++_Stl_Iterator_Containers_C++17 - Fatal编程技术网

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”}}