c++ - 如何从 std::map 修改提取的节点键
问题描述
在上一个问题中,我想使用循环将一些提取的节点从 a 存储std::map
到 a中。现在我可以做到这一点,我想在将节点键存储到之前修改它们,并且我得到一个编译错误(没有复制整个错误消息,它很长):std::vector<std::map<K, V>::node_type>
for
vector
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/bits/alloc_traits.h:514:4: error: no matching function for call to 'construct_at'
std::construct_at(__p, std::forward<_Args>(__args)...);
^~~~~~~~~~~~~~~~~
这是我正在做的事情:
std::vector<decltype(myMap)::node_type> tmp;
for (auto it = myMap.begin(); it != myMap.end();) {
if (it->second->needsToBeModified()) {
auto out = it++;
auto node = myMap.extract(out);
node.key() = someNewKey;
tmp.push_back(node); // The above error message points to this line
} else
it++;
}
如果我不将节点放入变量中,则错误消失:
std::vector<decltype(myMap)::node_type> tmp;
for (auto it = myMap.begin(); it != myMap.end();) {
if (it->second->needsToBeModified()) {
auto out = it++;
tmp.push_back(myMap.extract(out)); // This is fine
} else
it++;
}
所以我想我操纵节点的方式有些问题,但我还不能弄清楚。问题可能出在我的钥匙上std::pair<int16_t, uint32_t>
吗?
解决方案
节点句柄不可复制。因此,您无法在矢量中创建副本。
节点句柄是可移动的,这就是其他示例有效的原因。
可以使用标准函数从变量中移动std::move
:
tmp.push_back(std::move(node))