c++ - 两个单独的键映射到 std::map 中的单个条目

标签 c++ stdmap

我正在编写一段代码,目标是成为一个快速的“搜索引擎”。我在一个文件中有一些条目需要在读入整个文件后进行搜索。它们需要通过条目的名称和它从文件开头的偏移量来搜索。我的问题是内存使用问题之一,因为有数百万个条目。目前我正在使用两个单独的 std::maps 来存储数据,以便可以指定任一搜索词。这会导致数据的双重存储,而这正是我试图减少的。

我使用 valgrind massif 发现内存使用的主要部分是条目的双重存储。

目前的存储方式:

struct entry {
    std::string name;
    uint16_t offset;
    uint16_t size;
    bool isConst;
};

nameSearchMap.insert(std::pair<std::string, entry>(s_entry.name, e_entry));
offsetSearchMap.insert(std::pair<uint16_t, SymInfo>(s_entry.offset, s_entry));

有没有一种方法可以制作一张可通过任一类型的键搜索的 map ?

最佳答案

您可能会考虑使用

std::map<std::string, std::shared_ptr<entry>>

用于将字符串映射到条目,以及

std::map<uint16_t, std::shared_ptr<entry>>

请注意,通过对值负载使用共享指针(因此对两个映射使用相同的 entry 对象),您可以节省负载的大小。虽然您为两个共享指针付费,但您仍会为您的特定结构领先。

enter image description here

(感觉像画了一张图,重点是内存中只有一个entry对象。)


您可能还对 boost::bimap 感兴趣.

关于c++ - 两个单独的键映射到 std::map 中的单个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35273312/

相关文章:

c++ - MFC 对话框按钮显示为黑框

java - 默认构造函数,Java 与 C++

c++ - 在 C++ 范围内快速设置 map 中的值

c++ - 是否有在标准容器中使用 unique_ptr 的透明方法?

c++ - 插入新键时会更改现有键值的地址吗?

c++ - 如何使用 std::partial_sum 并输出到 std::map?

c++ - 单个构造函数来创建具有不同数据类型的对象

c++ - 在计算过程中将 int 类型转换为 long long 有什么好处?

c++ - 如何使用 VTK 制作自定义事件?

c++ - 将键移出 std::map<> &&