我一直在尝试使用
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++ 中的 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
}
您会注意到:
std::map<Key, T>::iterator
,而不是std::map<Key, T>::const_iterator.
这种方法将允许您修改提取的节点的键和值,然后将其重新插入到地图中,您可以在其中使用它进行数据操作