我正在寻找最有效的数据结构来维护索引列表。您可以轻松查看STL地图的内容:
std::map<int,std::vector<int> > eff_ds;
我使用此作为示例,因为我目前正在使用此设置。我想要执行的操作是:
我也在尝试使用无序地图和转发列表,
std::unordered_map<int,std::forward_list<int> > eff_ds;
如果我使用C ++或者还有其他选择,这是我在时间上能做的最好吗?
更新:
只要我对所有按键执行相同操作,我都可以进行插入 - 前/后。为了更清楚地解决我的问题,请考虑以下事项:
在我的算法的每次迭代中,我将有一个外部块给我一个(键,值) - 两者都是单个整数 - 对作为输出。当然,我必须将此值插入相应的键。此外,在不同的迭代中,可能返回具有不同值的相同密钥。最后,我的输出数据(写入文件)应如下所示:
k1: v1 v2 v3 v4
k2: v5 v6 v7
k3: v8
.
.
.
kn: vm
这些迭代次数相当大~1m。
答案 0 :(得分:1)
您的问题有两个方面:
在您希望能够使用数字键查找容器中的项目,使用大量键以及键是稀疏的
时,最佳容器是什么?数字键可能会为此提供一个向量,但是如果密钥填充稀疏会浪费大量内存。
假设你不想按顺序遍历键(你没有说明要求),那么unordered_map可能是最好的选择。
数字列表的最佳容器是什么,允许在任一端插入并能够按顺序检索数字列表(外部地图的值类型)
答案取决于您希望在前面插入元素的频率。如果这种情况经常发生,那么您可能需要考虑一个forward_list。如果你主要是插入到最后那么矢量会降低开销。
根据您更新的问题,因为您可以限制自己将值添加到列表末尾,并且由于您不关心列表中的重复条目,我建议使用std::unordered_map<int,vector<int> >