容器,其中一个维度是常量,一个是可变的

时间:2012-11-18 00:59:44

标签: c++ stl containers

我有一个系统,我需要获取特定位置的“代码”。存在恒定数量的位置,1到40,但是,每个位置可以具有不同数量的代码(从2到20)。容器是常量,需要定义,然后只用于查找程序其余部分的位置。

例如,我需要能够执行myCodes.at(position3)之类的操作并获取{1, 3, 9, 23, 52}myCodes.at(position7)并获取{23, 52}

因此,外部容器的大小是恒定的,但内部容器的大小可以在2到20之间变化。我知道如何使用数组的方法是使用数组,只需使第二个维度达到最大可能的大小(20 ):const int myCodes[40][20],然后用额外的0来“填充”内部数组。

然而,这感觉非常浪费,特别是因为许多内部阵列只能容纳2个元素。我也在学习C ++ 11,所以如果有的话,我更喜欢“现代”的解决方案。

3 个答案:

答案 0 :(得分:3)

这可能是你想要的:

std::array<std::vector<code>, const_size>

外部是恒定的,内部是动态的。

让两者保持不变并使用填充会更快,但更加丑陋,所以一开始不要尝试。 18 * 20未使用的整数在现代硬件上并没有太大的浪费。

答案 1 :(得分:2)

对于疯狂的方法,一个不同大小的std数组的元组加上一组迭代器数组到数组的开始/结束。第一个产生一个非均匀连续的块,如果是内存,第二个给你基于统一范围的访问。从理论上讲,第二个是可动的,但我只是缓存它。

将数组的元组转换为数组的代码将很有趣。

我真的会做一个矢量数组的前一个答案,甚至是矢量矢量。但是这种技术演示了使用现代C ++ 11可以获得什么样的漏洞。

答案 2 :(得分:2)

您应该使用vectors数组或lists数组。

std::array<std::vector<MyType>, const_size>

std::array<std::list<MyType, const_size>

两者都是一维静态而另一维动态的结构。