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

The*_*Bat 1 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));
Run Code Online (Sandbox Code Playgroud)

有没有办法可以制作一个可以通过任何一种键搜索的地图?

Ami*_*ory 5

你可以考虑使用

std::map<std::string, std::shared_ptr<entry>>
Run Code Online (Sandbox Code Playgroud)

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

std::map<uint16_t, std::shared_ptr<entry>>
Run Code Online (Sandbox Code Playgroud)

请注意,通过使用值有效负载的共享指针(因此entry对两个映射使用相同的对象),可以保存有效负载的大小.虽然您需要支付两个共享指针,但您仍然可以提前了解特定结构.

在此输入图像描述

(感觉就像绘制图表.但重点是entry内存中只有一个对象.)


您可能也有兴趣boost::bimap.