Tre*_*key 10 c++ containers iterator stl c++17
我习惯了现有的界面std::map.
插入元素返回描述成功插入的bool,
以及插入元素所在位置的迭代器.
template< class P >
std::pair<iterator,bool> insert( P&& value ); //(since C++11)
Run Code Online (Sandbox Code Playgroud)
C++ 17添加了看起来类似的调用,但具有不同的类型名称:
insert_return_type insert(node_type&& nh); //(since C++17)
Run Code Online (Sandbox Code Playgroud)
我试着查看node_type它是什么,但它主要是未指定的:
template</*unspecified*/>
class /*unspecified*/
Run Code Online (Sandbox Code Playgroud)
为什么在C++ 17中添加了这个功能,何时我会在旧的调用中使用它?
它不仅仅是std::map,所有关联和无序关联容器都添加了类似的功能.它们在[container.node]/1的标准中解释
甲节手柄是接受单个元件的所有权从关联的容器(23.2.4)或无序关联的容器(23.2.5)的对象.它可用于将该所有权转移到具有兼容节点的另一个容器.具有兼容节点的容器具有相同的节点句柄类型....
上面的表格显示了具有兼容节点的容器.
节点处理接口允许您执行的操作是将元素(节点)从一个容器传输到另一个容器(兼容),而无需复制/移动元素.相反,由容器维护的各个内部节点作为整体传输.
当处理包含不可复制,不可移动类型的容器时,这是必要的.
您可以std::map使用其extract()函数从a获取节点.然后,您可以将该节点放入另一个映射(或在更改其密钥后放入相同的映射).
Run Code Online (Sandbox Code Playgroud)node_type extract(const_iterator position); (1) (since C++17) node_type extract(const key_type& x); (2) (since C++17)1)取消链接包含position指向的元素的节点,并返回拥有它的节点句柄
2)如果容器有一个等效键的x元素,则从容器中取消链接包含该元素的节点,并返回一个节点句柄拥有它.否则,返回一个空节点句柄.在任何一种情况下,都不会复制或移动任何元素,只会重新容纳容器节点的内部指针(可能会发生重新平衡,与erase()一样)提取节点会使提取元素的迭代器无效.指针和对提取的元素的引用仍然有效,但是当元素由节点句柄拥有时不能使用它们:如果元素被插入到容器中,它们就变得可用.
例:
Run Code Online (Sandbox Code Playgroud)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”}}