一个整数散列问题 我有一个C++ STD::map,包含了数百万个MyObjult**对象。我能拥有的最大对象数量大约是1亿。关键是对象的id。在特定过程中,这些对象必须以某种方式尽快标记为0或1。标记不能发生在对象本身上,因此我不能引入成员变量并将其用于标记过程。由于我知道最小和最大id 1到100_000_000,我首先想到的是使用std::bit_集并在那里执行标记。这解决了我的问题,也使标记进程并行运行时变得更容易,因为这些进程使用自己的bit_集来标记事物,但我想知道如果我必须使用其他方法而不是0-1标记,那么解决方案是什么,例如,如果我必须用整数标记所有对象,我可以使用什么

一个整数散列问题 我有一个C++ STD::map,包含了数百万个MyObjult**对象。我能拥有的最大对象数量大约是1亿。关键是对象的id。在特定过程中,这些对象必须以某种方式尽快标记为0或1。标记不能发生在对象本身上,因此我不能引入成员变量并将其用于标记过程。由于我知道最小和最大id 1到100_000_000,我首先想到的是使用std::bit_集并在那里执行标记。这解决了我的问题,也使标记进程并行运行时变得更容易,因为这些进程使用自己的bit_集来标记事物,但我想知道如果我必须使用其他方法而不是0-1标记,那么解决方案是什么,例如,如果我必须用整数标记所有对象,我可以使用什么,c++,bit-manipulation,hash,C++,Bit Manipulation,Hash,是否有某种形式的数据结构可以以紧凑的内存方式处理此类问题,并且速度也很快?感兴趣的主要查询是对象是否被标记,以及使用什么标记 多谢各位 注意:std::map无法更改。无论我使用什么样的数据结构,都不能处理映射本身。将映射的值类型设置为std::pair而不是MyObject*?如果您不关心内存,那么std::vector或任何适合您的需要而不是int的东西都可以工作 如果您不喜欢这样,并且无法修改地图,那么为什么不为标记创建平行地图呢 std::map<id,T> my_objec

是否有某种形式的数据结构可以以紧凑的内存方式处理此类问题,并且速度也很快?感兴趣的主要查询是对象是否被标记,以及使用什么标记

多谢各位


注意:std::map无法更改。无论我使用什么样的数据结构,都不能处理映射本身。

将映射的值类型设置为std::pair而不是MyObject*?

如果您不关心内存,那么std::vector或任何适合您的需要而不是int的东西都可以工作

如果您不喜欢这样,并且无法修改地图,那么为什么不为标记创建平行地图呢

std::map<id,T> my_object_map;
std::map<id,int> my_marker_map;
如果无法直接修改对象,在将对象放置到地图中之前,是否考虑过包装对象?e、 g:

struct
{
    int marker;
    T *p_x;
} T_wrapper;


std::map<int,T_wrapper> my_map;
如果您无论如何都需要进行查找,那么这不会慢下来

编辑:正如@tenfour在其回答中所建议的,std::pair在这里可能是一个更干净的解决方案,因为它保存了结构定义。就我个人而言,我不太喜欢std::pairs,因为你必须把所有东西都称为first和second,而不是有意义的名字。但那只是我。。。
要问自己的最重要的问题是,这100000000个对象中有多少可能被标记或保持未标记状态?如果答案小于大约100000000/2*sizeofint,则只需使用tr1之前的另一个std::set或std::tr1::unordered_set hash_set跟踪哪些已标记或未标记

2*sizeofint从哪里来?它是对在将要标记的项列表的deque中维护堆结构的内存开销的估计

如果它更大,则使用std::bitset,就像您将要使用的一样。它的开销实际上是您所需数量的0%。您需要大约13兆字节的连续ram来保存位集

如果需要存储标记和状态,则使用Object*键和marker\ u type值使用std::tr1::unordered\ u映射。同样,如果标记节点的百分比高于前面提到的比较,那么您需要使用某种比特集来保持所需的比特数,并适当调整大小,使其为每比特12.5兆字节

考虑到需求的澄清,保存位集的特制对象可能是您的最佳选择


编辑:这假设您已经对您可以接受的解决方案进行了适当的时间复杂度计算,因为不再允许更改基本std::map结构。

如果您不介意使用hacks,请查看Boost.MultiIndex中使用的。它可以在已存储指针的LSB中存储一位。

不幸的是,我无法更改它。在这种情况下,我还将使用std::bitset。100000000位只有125MB。我不能改变我的地图,内存是一个大问题。我考虑使用另一个,但不知何故不喜欢整个想法。也许我会试一试。谢谢。回答得很好,但请记住,时间复杂度和内存复杂度可能会影响这个决定。但OP的问题是,当一个人想要在每个节点上存储超过一个比特时,他会怎么做。。。