用于执行索引列表的C ++数据结构

时间:2014-10-10 03:09:53

标签: c++ data-structures map stl

我正在寻找最有效的数据结构来维护索引列表。您可以轻松查看STL地图的内容:

std::map<int,std::vector<int> > eff_ds;

我使用此作为示例,因为我目前正在使用此设置。我想要执行的操作是:

  • 根据键插入值:类似于eff_ds [key] .push_back(..);
  • 根据每个键打印数据结构的内容。

我也在尝试使用无序地图和转发列表,

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。

1 个答案:

答案 0 :(得分:1)

您的问题有两个方面:

  1. 在您希望能够使用数字键查找容器中的项目,使用大量键以及键是稀疏的

    时,最佳容器是什么?

    数字键可能会为此提供一个向量,但是如果密钥填充稀疏会浪费大量内存。

    假设你不想按顺序遍历键(你没有说明要求),那么unordered_map可能是最好的选择。

  2. 数字列表的最佳容器是什么,允许在任一端插入并能够按顺序检索数字列表(外部地图的值类型)

    答案取决于您希望在前面插入元素的频率。如果这种情况经常发生,那么您可能需要考虑一个forward_list。如果你主要是插入到最后那么矢量会降低开销。

  3. 根据您更新的问题,因为您可以限制自己将值添加到列表末尾,并且由于您不关心列表中的重复条目,我建议使用std::unordered_map<int,vector<int> >