请注意,这个问题仅关于C ++ ,我对使用现有数据库库不感兴趣,也不寻求“c ++中的数据库”的通用解决方案。我有一个特定的问题,并且遵循以下问题的最有效(在时间,空间和最佳实践方面)解决方案。
假设我有一系列书籍,由Id
,ISBN
,Author
和Name
描述。 Name
列将是一个与单独的作者表相关的ID,其中包含Id
,Surname
,First Name
列。我希望能够有效按名称和作者进行搜索。我将如何构建这个,以及我将使用哪些容器?
此主题已在SO和elsewhere上多次展开,但从未提及与C ++或不使用现有库的实现相关的答案。
天真的解决方案只是创建两个单独的类:Author
和Book
:
class Book
{
public:
int id;
std::string isbn;
Author* author;
std::string name;
};
class Author
{
public:
int id;
std::string surname;
std::string givenName;
};
然后我可以创建Book和Author(指针)的向量。但是我如何有效地索引这些?假设我想通过它的ISBN找到一本书;我怎样才能在恒定或至少对数时间内做到这一点?这可能吗?这种问题有标准做法吗?
答案 0 :(得分:4)
首先,标准容器不支持通过多个键进行索引 - 每个容器仅支持一个键。这可以是复合键,因此如果您有三本不同作者具有相同标题的书籍,您可以同时指定标题和作者以仅查找其中一个。但是,没有一个标准容器支持按标题或作者单独搜索。
Boost Multi-Index库可以直接支持每个项目的多个键。多指数教程example of creating foreign keys非常像您对使用感兴趣。
Multi-Index支持(红黑)基于树的索引和基于散列的索引。像往常一样,你在两个散列指数之间进行权衡通常可以更快地查找单个项目,但是基于树的索引支持不等式,所以如果你想要搜索范围(例如, “作者姓氏从'C'到'L'的姓氏”。
答案 1 :(得分:3)
如果您只需要反向映射,则索引的标准数据结构是哈希映射,如果您还需要排序,则需要二进制搜索树。在C ++中,它们分别是unordered_map和map。
假设我想通过其ISBN找到一本书;
创建unordered_map<std::string,Book*>
,搜索将是固定时间。