地图,配对矢量或两个矢量......?

时间:2014-12-31 10:46:59

标签: c++ vector structure std-pair

我通读了一些帖子和" wikis"但仍无法确定哪种方法适合我的问题。

我创建了一个名为Sample的类,它包含一定数量的化合物(假设这是另一个类Nuclide),具有一定的相对数量(双倍)。

因此,像(伪):

class Sample {
    map<Nuclide, double>;
}

如果我在示例中有核素Ba-133Co-60Cs-137,我将不得不在代码中使用这些名称来访问地图中的核素。但是,我唯一需要做的就是遍历地图来执行计算(它们对核素没有意义),因此,我将使用for循环。我想迭代而不关注键名,因此,我需要使用地图的迭代器,我是对的吗?

替代方案是vector<pair<Nuclide, double> >

class Sample {
    vector<pair<Nuclide, double> >;
}

或只是两个独立的载体

Class Sample {
    vector<Nuclide>;
    vector<double>;
}

而在最后一个选项中,核素与其数量之间的联系将是&#34;元信息&#34;,仅由相应向量中的位置给出。

由于我缺乏深刻的经验,我会请求选择何种方法的建议。我想让所有可用化合物的迭代变得快速而简单,同时保持相应键和值的逻辑结构。

PS:样本中的计算数量可能非常低(1到5)! PPS:可以通过一些const语句修改最后一个选项以防止更改,从而保持正确的顺序吗?

1 个答案:

答案 0 :(得分:1)

如果迭代需要很快,你不需要std::map<...>:它的迭代是一个很快就会变坏的树。如果您对序列有许多突变,您需要按键排序的序列,std::map<...>实际上是合理的。如果你有突变,但你不关心顺序std::unordered_map<...>通常是一个更好的选择。但是,这两种地图都假设您正在按键查找内容。根据你的描述,我并不认为情况确实如此。

std::vector<...>快速迭代。不过,它不适合观看。如果你保持订购状态,你可以使用std::lower_bound()进行std::map<...> - 就像查找一样(即复杂性也是O(log n))但是保持排序的努力可以做出选择太贵了。但是,它是一个理想的容器,用于将一堆对象保持在一起进行迭代。

您是否需要一个std::vector<std::pair<...>>或更确切地说两个std::vector<...>取决于您访问元素的方式:如果元素的两个部分都必须一起访问,那么您需要{{1这样可以保存一起访问的数据。另一方面,如果您通常只访问两个组件中的一个,那么使用两个单独的std::vector<std::pair<...>>将使迭代更快,因为更多的迭代元素适合缓存行,特别是如果它们像{{{{}那样相当小1}} S上。

在任何情况下,我都建议将外部结构暴露给外界,而是提供一个界面,让您稍后可以更改底层表示。也就是说,为了获得最大的灵活性,您不希望将表示法烘焙到所有代码中。例如,如果您根据Eric Niebler的Range Proposal使用访问器函数对象(根据BGL投影 属性映射)来访问基于的元素迭代器,而不是访问元素,您可以更改内部布局而不必触及任何算法(但您需要重新编译代码):

std::vector<...>

有一对这些就地,例如一个简单地运行它们并打印它们的算法可能如下所示:

double

两种表示方式完全不同,但访问它们的算法完全独立。这样,尝试不同的表示也很容易:只需要更改访问它的算法的表示和粘合。