我需要一个类似于 Map 的结构,但我不关心键值,只关心与键对应的值。
在 map 上,我需要做这样的事情:
map[1] = "value1"
map[2] = "value2"
它给了我不选择冲突键的责任。我可以通过这样做来解决这个问题:
let handle = randomValue();
map[handle] = "value1"
因为我不关心键的值,所以我只需要它的句柄。如果两个随机值相等,仍然存在值冲突的问题。我可以写一些东西来检查键是否已经存在于映射中并生成一个新键,但是一旦结构有点满,我就会遇到很多冲突。
一开始列表似乎是个不错的选择,但事实并非如此,因为如果我删除一个元素,所有其他元素的索引都会重新排列。
我不想自己实现,而是想知道 C++ 中是否已经有这样的东西:一个映射,您可以在其中获得一个句柄,使您可以访问该值。
我还有一个要求:有时我实际上需要将这个句柄传递给 Rust,所以我认为如果这个句柄可以转换为数字并返回,那将非常有用。
最佳答案
IIUC,您想要一个具有以下功能的容器:
- 能够添加新元素并为其获取数字句柄
- 能够删除现有元素
您在这里不需要映射容器,因为您没有给定的 key 。但是您希望从句柄直接访问。所以你需要的是一个 vector 。如果你从不删除元素,你将项目 push_back 到 vector 的末尾并将它们的索引作为句柄。如果您希望能够快速删除元素,我会为空槽使用一个特殊值,并将空索引存储在辅助容器中,通常是堆栈或队列。在这里我会再次使用 vector,因为它是一个非常简单的容器并将其用作堆栈,但如果您想将其用作队列,则可以使用 dequeue 或 forward_list。
因此,要删除一个元素,您将其标记为空并将其索引存储在空列表中,并添加一个元素,您首先尝试从空列表中获取下一个位置,并将其推回到主 vector 的末尾如果列表为空。
添加和删除都是常数时间。
关于c++ - 是否有像映射这样的 C++ 结构,但我得到的不是值的键,而是值的句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62422503/