What is the fastest way to change a key of an element inside std::map(更改 std::map 中元素键的最快方法是什么)
问题描述
我理解人们不能这样做的原因(重新平衡和其他东西):
I understand the reasons why one can't just do this (rebalancing and stuff):
iterator i = m.find(33);
if (i != m.end())
i->first = 22;
但到目前为止,更改键的唯一方法(我知道)是从树中完全删除节点,然后使用不同的键插入值:
But so far the only way (I know about) to change the key is to remove the node from the tree alltogether and then insert the value back with a different key:
iterator i = m.find(33);
if (i != m.end())
{
value = i->second;
m.erase(i);
m[22] = value;
}
出于更多原因,这对我来说似乎效率很低:
This seems rather inefficient to me for more reasons:
遍历树三次(+ balance)而不是两次(+ balance)
Traverses the tree three times (+ balance) instead of twice (+ balance)
另一个不必要的值副本
不必要的解除分配然后重新分配树内的节点
Unnecessary deallocation and then re-allocation of a node inside of the tree
我发现分配和释放是这三个中最差的.我是不是遗漏了什么,或者有更有效的方法吗?
I find the allocation and deallocation to be the worst from those three. Am I missing something or is there a more efficient way to do that?
我认为,理论上应该是可能的,所以我认为针对不同的数据结构进行更改是不合理的.这是我想到的伪算法:
I think, in theory, it should be possible, so I don't think changing for a different data structure is justified. Here is the pseudo algorithm I have in mind:
在树中找到我想要更改其键的节点.
Find the node in the tree whose key I want to change.
如果从树中分离(不要解除分配)
Detach if from the tree (don't deallocate)
重新平衡
更改分离节点内的密钥
将节点插入回树
重新平衡
推荐答案
在 C++17 中,新的 map::extract
函数可让您更改密钥.
示例:
In C++17, the new map::extract
function lets you change the key.
Example:
std::map<int, std::string> m{ {10, "potato"}, {1, "banana"} };
auto nodeHandler = m.extract(10);
nodeHandler.key() = 2;
m.insert(std::move(nodeHandler)); // { { 1, "banana" }, { 2, "potato" } }
这篇关于更改 std::map 中元素键的最快方法是什么的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:更改 std::map 中元素键的最快方法是什么
- GDB 不显示函数名 2022-01-01
- DoEvents 等效于 C++? 2021-01-01
- XML Schema 到 C++ 类 2022-01-01
- OpenGL 对象的 RAII 包装器 2021-01-01
- 如何提取 __VA_ARGS__? 2022-01-01
- 将 hdc 内容复制到位图 2022-09-04
- 使用 __stdcall & 调用 DLLVS2013 中的 GetProcAddress() 2021-01-01
- 将函数的返回值分配给引用 C++? 2022-01-01
- 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值 2021-01-01
- 哪个更快:if (bool) 或 if(int)? 2022-01-01