【问题标题】:When do I use node_type with std::map::insert?何时将 node_type 与 std::map::insert 一起使用?
【发布时间】:2017-01-18 06:46:49
【问题描述】:

我已经习惯了std::map的现有界面。
插入元素返回一个描述成功插入的布尔值,
以及插入元素的位置的迭代器。

template< class P >
std::pair<iterator,bool> insert( P&& value ); //(since C++11)

C++17 添加了类似的调用,但类型名称不同:

insert_return_type insert(node_type&& nh);   //(since C++17)

我尝试查找 node_type 是什么,但它主要是未指定的:

template</*unspecified*/>
class /*unspecified*/

为什么在 C++17 中添加了这个函数,我什么时候可以在旧调用中使用它?

【问题讨论】:

    标签: c++ stl iterator containers c++17


    【解决方案1】:

    不仅仅是std::map,所有关联和无序关联容器都添加了类似的功能。它们在[container.node]/1的标准中进行了解释

    节点句柄是一个对象,它接受来自关联容器 (23.2.4) 或无序关联容器 (23.2.5) 的单个元素的所有权。它可用于将该所有权转移到另一个容器 与兼容的节点。具有兼容节点的容器具有相同的节点句柄类型。 ...

    上节后面的表格显示了具有兼容节点的容器。

    节点句柄接口允许您将元素(节点)从一个容器转移到另一个(兼容)容器,而无需复制/移动元素。而是将容器维护的各个内部节点作为一个整体进行传输。

    在处理包含不可复制、不可移动类型的容器时,这是必要的。

    【讨论】:

      【解决方案2】:

      您可以使用std::map 的extract() 函数从std::map 获取节点。然后您可以将该节点放入另一个映射(或更改其键后放入同一个映射)。

      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 的元素,取消链接包含的节点 来自容器的那个元素并返回一个拥有的节点句柄 它。否则,返回一个空节点句柄。

      在任何一种情况下,都不会复制或移动元素,只有内部元素 容器节点的指针被重新指向(可能发生重新平衡, 与擦除()一样)提取节点会使迭代器无效 提取的元素。指向提取元素的指针和引用 保持有效,但不能在元素由节点拥有时使用 句柄:如果元素被插入到 容器。

      例子:

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

      【讨论】:

        猜你喜欢
        • 2017-08-13
        • 2010-10-22
        • 1970-01-01
        • 2014-03-01
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        相关资源
        最近更新 更多