c++ - 是否有像映射这样的 C++ 结构,但我得到的不是值的键,而是值的句柄?

标签 c++ std

我需要一个类似于 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/

相关文章:

c++ - 使用 std::transform 从特定目标偏移量插入到目标中

从输入文件创建 3D 阵列?

c++ - 从 boost::shared_ptr 到 std::shared_ptr 的转换?

c++ - 关于初始化引用指针的问题

c++ - 异或运算符 C++

c++ - ' vector 迭代器不兼容'

c++ - std::optional 成员是否连续存储?

c++ - GCC 编译时出现警告 : unknown escape sequence: '\040'

c++ - 如何在 C++11 中实现类型化字符串?

c++ 为什么并不总是需要静态成员的定义?