c++以不止一种方式访问​​相同的元素

标签 c++ dictionary std

我的 Item 类如下所示:

class Item {
    int unique_key;
    long property;
};

我有一个数字或项目,我需要在恒定的 O(1) 时间内通过 unique_key(每个项目不同)和 property(更多项目可以具有相同的属性)。

我在想这样的事情:

std::map<int, Item*> my_map1;
std::multimap<long, Item*> my_map2;

但我想知道是否有其他更好的解决方案可以使用更少的内存并避免保持 map 同步。

最佳答案

I need to access them in constant O(1) time

std::mapstd::multi_map 都没有元素的常量时间访问,都是 O(lg N)。如果您需要持续访问,则必须使用 std::unordered_mapstd::unordered_multimap ,这两个容器都是在 C++11 中引入的。

如果您无法访问 C++11 编译器,那么就没有可进行恒定时间访问的字典/哈希表容器。

但是,如果 unique_key 的生成方式是 0...N,并且 property 也是 0...M ,对于一些 N,M,那么你可以简单地有:

std::vector<Item*> my_map1;
std::vector<std::vector<Item*>> my_map2;

如果您有密集的 ID 集合,那将是持续访问并且是最有效的解决方案。但是如果 ID 的集合是稀疏的(例如,你的 ID 可能有 0、500 和 1000 万),那么这个解决方案就很糟糕了。

关于c++以不止一种方式访问​​相同的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31703895/

相关文章:

c++ - 在 C++ 中,将 std::numeric_limits<double>::max() 用作特殊的 "flag"是否安全?

c++ - GetAsyncKeyState 和 ofstream

c++ - 未解析的外部符号结构

c++ - 无序映射初始化失败

c++ - 重载 << 运算符以打印出 std::list

c++ - 构造一个没有默认构造函数的空对象

swift - 打印时如何将数组拆分为指定的行?

dictionary - 将 map[string]string 转换为 map[someStruct]string

c++ - C++中二维数组的标准实现

c++ - 无符号变量的默认值是多少?