如何将 std::map 提取与迭代器一起使用?

问题描述 投票:0回答:1

我一直在尝试使用

extract()
有效地拔出钥匙并更换它,正如文档所说是可能的。但是,我无法使用“常规”
iterator
来编译我的代码,并且文档意味着必须使用
const_iterator
来代替。

这是我一直在使用的代码:

auto nodehandler = m_map.extract(replace_iter);
nodehandler.key = keyBegin;
nodehandler.value = val;
m_map.insert(replace_iter,nodehandler);

我稍微研究了一下

const_iterator
,它背后的目的似乎是它只能访问容器,但不能修改它们,但文档似乎非常强大,只在
const_iterator
中使用
extract()
,它明确用于修改 std::map 容器,所以我真的不明白。

此外,我不确定如何实际获取一个

const_iterator
,或者使用一个。我尝试将我的
iterator
转换为
const_iterator
类型,但我认为这不会起作用。

const_iterator test_iter = (const_iterator)replace_iter;
/*auto nodehandler = m_map.extract(test_iter);
nodehandler.key = keyBegin;
... etc.
*/

那么真正让它发挥作用的正确方法是什么?

c++ c++17 stdmap
1个回答
0
投票

使用过 C++ 后,C++ 中的 const_iterator 用于访问容器的元素而不修改它们。由于 extract() 旨在修改映射(通过提取并可能修改节点),我建议您使用常规迭代器,而不是 const_iterator。请参阅此文档以获取参考

为了解决这个问题,我提供了一个片段来说明我的观点

auto replace_iter = m_map.find(some_key);  // Ensure this is a non-const iterator
if (replace_iter != m_map.end()) {
    auto nodehandler = m_map.extract(replace_iter);
    nodehandler.key() = keyBegin;  // provided the needed key 
    nodehandler.mapped() = val;    // Change the value you would like to have 
    m_map.insert(std::move(nodehandler)); // Reinsert the modified node
}

您会注意到:

  1. 迭代器类型:确保replace_iter的类型为
    std::map<Key, T>::iterator
    ,而不是
    std::map<Key, T>::const_iterator.

这种方法将允许您修改提取的节点的键和值,然后将其重新插入到地图中,您可以在其中使用它进行数据操作

© www.soinside.com 2019 - 2024. All rights reserved.