需要选择一个容器来存储我的数据
Need to choose a container to store my data
我有一个数据,我需要对它进行搜索和排序。数据只是一堆结构对象,看起来像这样:
struct ContactInfo {
std::string name;
std::string description;
std::string phoneNumber;
std::string email;
ContactInfo(std::string name, std::string phone, std::string email, std::string desc);
ContactInfo();
};
如果我把它放在以"名称"为关键字的地图中,如果我搜索"描述"、"电话号码"或"电子邮件",我将不得不执行线性搜索。
我的问题是:我有更好的方法来保存数据,以便更快地进行搜索吗?
关联STL容器(map
和unordered_map
)是围绕单个索引的最典型情况构建的。
如果你想在多个字段上建立索引,你有几个解决方案:
- 最简单的方法是:使用多个容器,每个容器都在自己的字段上建立索引,并保留记录的副本(更新记录会很麻烦)
- 更难的是:使用多个容器,每个容器都在自己的字段上建立索引,共享记录(
std::shared_ptr<ContactInfo>
) - 更难:与前一个相同,但使用拥有记录的"主"容器可以提高效率(减少间接性)
在您的情况下,如果您必须更新记录,我将从(1)开始,然后转到(2)。
不过,请记住,更新是一项复杂的任务,因为每次更新记录时,都必须在更新的字段上重新编制索引。为了简化查找,您可以在每个引用项目的容器中保留一个迭代器,并使用这些迭代器进行擦除,而无需支付查找费用:当您将项目放入map
(或unordered_map
)时,调用insert
会返回此迭代器。
如果您希望能够在为多个字段指定查询值的情况下进行查询,那么在字段总数很大的情况下,获得每个查询的最佳O(1)运行时间是一个痛苦的问题。然而,听起来您一次只想根据一个字段值进行查询。为此,只需使用Hashmap或您正在使用的任何东西来按名称快速索引,并对所有其他字段执行相同的操作。由于您需要O(#records*#fields)存储来存储原始数据,并且每个哈希映射或排序数组或您正在使用的任何东西的大小都是O(#records),如果您对每个字段都这样做,则您有#个字段,存储总量渐进地不大于原始数据存储大小(当然,您需要在搜索结构中存储指向记录的指针,而不是记录本身,以获得该存储绑定)。
相关文章:
- 使用 char* 存储数据和产生的错误
- 我可以存储数据的地方/C++,Linux,QtCreator
- 如何在共享库的整个生命周期内存储数据
- 在字符串数组中动态创建和存储数据
- 用指向文件的指针存储数据结构
- 如何存储数据/我们如何获取存储在 unordered_map c++11 中存储桶中的数据
- 存储数据的对象和存储指向数据的智能指针的对象
- C++读取文本文件并存储数据
- Cocos2dx: 无法存储数据?
- 如何在每次循环迭代期间生成向量,存储数据,然后删除该向量?
- 尝试从每个预期数据之间有多个空间的文件中读取和存储数据
- 存储数据列表并自动分配给结构的最佳方法是什么
- QT MAC应用程序存储数据路径
- 动态分配存储数据在堆中的随机位置中
- 鸟类调查中的项目在代码中遇到问题.如何像数据库系统一样存储数据
- 可以在C 中永久存储数据中的数据
- 用于存储数据的结构和外部二进制文件
- 使用 char 数组存储数据
- 在结构中读取和存储数据
- 尝试在结构中存储数据时出现堆分配错误