【发布时间】:2010-12-21 01:58:44
【问题描述】:
有没有办法在地图中找到不存在的键?
我正在使用std::map<int,myclass>,我想为新项目自动生成一个密钥。项目可能会以与插入不同的顺序从地图中删除。
myclass 项目可能相同,也可能不同,因此它们不能单独作为键。
在程序运行期间,生成和删除的item数量没有限制,所以我不能用counter作为key。
具有相同功能和性能的替代数据结构也可以。
编辑
我试图为我的项目构建一个容器 - 这样我就可以根据它们的键删除/修改项目,并且我可以迭代这些项目。键值本身对我没有任何意义,但是,其他对象将存储这些键以供内部使用。
我不能使用增量计数器的原因是,在程序的生命周期内,它们可能超过 2^32(或理论上 2^64)个项目,但是即使在所有其他项目之后,项目 0 理论上可能仍然存在项目被删除。
最好向 std::map 询问最低值的未使用键,这样我就可以将它用于新项目,而不是使用向量或其他一些外部存储来存储未使用的键。
【问题讨论】:
-
您打算如何访问地图中的项目?听起来您甚至可能不需要地图数据结构。您是否要生成密钥然后保留它们以便访问元素?而且,如果您无论如何都必须保留密钥……那么您不知道哪些密钥正在使用,哪些未使用?
-
我真诚地怀疑会有超过 2^64 个项目。
-
如果您只使用 64 位计数器变量就可以了。考虑一下:在我的计算机上,仅 增加 变量 1,000,000,000 次大约需要 2 秒。这意味着,我需要至少 1169 年才能遍历 64 位整数的整个范围。现在,如果人类文明在公元 3178 年仍然存在,并且您的程序仍在运行,那么您的(可能是电子人)后代将只需要重新启动应用程序。
-
'最好向 std::map 询问最低值的未使用键':std:map 没有这样的功能。您也许可以手动实现一个红黑树(std::map 的常用数据结构),并且能够在 log(n) 时间内无需额外存储来回答您的问题
-
@Managu:这就是我的想法……但是重写整个事情是一种耻辱。也许可以继承 std::map 并添加这样的功能。
标签: c++ data-structures stl