【发布时间】:2014-12-31 10:46:59
【问题描述】:
我阅读了一些帖子和“wiki”,但仍然无法确定哪种方法适合我的问题。
我创建了一个名为Sample 的类,其中包含一定数量的化合物(假设这是另一个类Nuclide),具有一定的相对数量(双倍)。
因此,类似于(伪):
class Sample {
map<Nuclide, double>;
}
如果我在示例中有核素 Ba-133、Co-60 和 Cs-137,我将不得不在代码中使用这些名称来访问地图中的这些核素。但是,我唯一需要做的就是遍历地图以执行计算(它们是哪些核素并不重要),因此,我将使用 for 循环。我想在不关注键名的情况下进行迭代,因此,我需要为地图使用迭代器,对吗?
另一种选择是vector<pair<Nuclide, double> >
class Sample {
vector<pair<Nuclide, double> >;
}
或者只是两个独立的向量
Class Sample {
vector<Nuclide>;
vector<double>;
}
而在最后一个选项中,核素与其数量之间的联系将是“元信息”,仅由相应向量中的位置给出。
由于我缺乏深厚的经验,我会恳请您对选择哪种方法提出建议。我希望通过所有可用的化合物快速轻松地进行迭代,同时保持相应键和值的逻辑结构。
PS.:样本中的化合物数量可能非常少(1 到 5)!
PPS.: 是否可以通过某些const 语句修改最后一个选项以防止更改,从而保持正确的顺序?
【问题讨论】:
-
前两个都不错。我想第一个将为您提供更有用的界面(例如,按键访问)。如果您开始衡量性能问题,我只会开始进一步研究。
-
使用
boost::container::flat_map<>获得最佳语义和性能。 -
如果你有固定数量的核素,你可以把它们变成枚举并使用 double[NUCLIDES_COUNT]。使用更多内存,但访问时间更短。
-
您是否在基于
Nuclide的结构中进行任何查找?此外,根据您的描述,尚不清楚Nuclide和double是否都用于计算或仅double。最后,序列中元素的顺序是否重要(除了Nuclide和double一起出现)? -
@DietmarKühl 实际上,它主要是
Nuclides的属性,用于计算。但是,计算会随着时间的推移而变化,会执行不同的计算 - 不幸的是,目前尚不清楚,因此我需要最大的灵活性。 (所有这些都是模拟的一部分,将随着时间的推移而改进。)我希望Sample类提供结构良好的信息,然后可以以简单的方式访问这些信息,主要用于 for 循环中的计算......顺序没关系。
标签: c++ vector structure std-pair