具有两个搜索条件的C++关联容器
C++ associative container with two search criteria
我正在寻找一个容器来存储一个名为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"包装器中。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在没有太多条件句的情况下,我如何避免被零除
- 基于多个条件处理地图中的所有元素
- 条件constexpr函数
- 无论条件是否为true,if总是在c++中执行
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 基于模板值的条件变量
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 将按位if条件转换为普通if条件
- 条件断点在不应该触发时触发
- 为什么简单的算术减法在"if"条件下不起作用?
- 如何在for循环中包含两个索引值的测试条件
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 我提出什么条件才能再加5%的折扣
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 没有超时的C++条件变量
- 正在LLVM中检测整数比较条件
- 在条件变量中触发错误信号的频率是多少