我正在编写一段代码,目标是成为一个快速的“搜索引擎”。我在一个文件中有一些条目需要在读入整个文件后进行搜索。它们需要通过条目的名称和它从文件开头的偏移量来搜索。我的问题是内存使用问题之一,因为有数百万个条目。目前我正在使用两个单独的 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
对象),您可以节省负载的大小。虽然您为两个共享指针付费,但您仍会为您的特定结构领先。
(感觉像画了一张图,重点是内存中只有一个entry
对象。)
您可能还对 boost::bimap
感兴趣.
关于c++ - 两个单独的键映射到 std::map 中的单个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35273312/