具有两个搜索条件的C++关联容器

C++ associative container with two search criteria

本文关键字:条件 C++ 关联 搜索 两个      更新时间:2023-10-16

我正在寻找一个容器来存储一个名为Link的类的对象,该类有一个成员变量:"std::string linkID"。容器的大小可以高达几百万,因此更倾向于快速查找。1-稍后我需要使用linkID查找容器2-但是,由于某些原因,添加对象的顺序也很重要。

我已经浏览了矢量、列表、集合、地图。。。我将学习muliset,multimap和boost multiindex。但我想,作为C++的新手,我仍然需要一些更有经验的意见来帮助我根据以上两个标准选择最好的容器。

谢谢vahid

对我来说,这看起来是boost::multi_index_container 的性能用例

您的类型声明应该与这个(未测试的)类似

typedef multi_index_container<
    Link,
    indexed_by<
        sequenced<>,
        ordered_unique< member< Link, std::string, &Link::linkID> >,
        ordered_unique< member< Link, std::string, &Link::linkID_2 > >
    >
> LinkList;
LinkList s;
s.push_back(Link(...));

它通常与Frerich Raabe发布的解决方案相同。但我认为陷阱更少,可能更优化。阅读boost页面上的教程,了解如何访问存储在s.中的元素

您的评论。。。

事实上,我正在开发一个已经存在的项目,在已使用std::vector仅存储元素(如您所指出的out)。所以现在我可以按原样使用"存储"向量,然后添加你建议的地图?

这是不可能的。矢量迭代器仍然无效。当向矢量添加或删除元素时,它们可能会变得未定义。

这听起来非常适合使用Boost Bimap。

如果查找链接的属性不经常更改,可以选择std::list<Link>作为存放链接对象的主容器。然后,对于每个标准,都有一个std::map,它将一个值映射到指向列表的迭代器。例如

typedef std::list<Link> LinkList;
LinkList links = ...;
std::map<std::string, LinkList::iterator> linkByName;
std::map<unsigned int, LinkList::iterator> linkByPopularity;

std::list的好处是它有非常强的迭代器无效保证(基本上,只有从列表中删除元素,列表中的迭代程序才会无效)。

为了使这些结构得到一致的更新,您可以将所有这些包装到"LinkCollection"包装器中。