我必须使用 A 类作为元素创建一个三维数组,A 类定义如下,我应该使用vector<vector<vector<A> > >
还是boost::multi_array
?哪一个更好?
struct C
{
int C_1;
short C_2;
};
class B
{
public:
bool B_1;
vector<C> C_;
};
class A
{
public:
bool A_1;
B B_[6];
};
我必须使用 A 类作为元素创建一个三维数组,A 类定义如下,我应该使用vector<vector<vector<A> > >
还是boost::multi_array
?哪一个更好?
struct C
{
int C_1;
short C_2;
};
class B
{
public:
bool B_1;
vector<C> C_;
};
class A
{
public:
bool A_1;
B B_[6];
};
如果您当时知道所有三个维度的大小,并且您编写了代码,并且不需要检查数组边界,那么只需使用传统数组:
const int N1 = ...
const int N2 = ...
const int N3 = ...
A a[N1][N2][N3]
如果数组维度只能在运行时确定,但在程序初始化后保持不变,并且如果数组使用分布均匀,那么 boost::multi_array 是你的朋友。但是,如果在运行时正在进行大量动态扩展,和/或如果数组大小不统一(例如,您需要 A[0][0][0...99] 但只需要 A[2][ 3][0...3]),那么嵌套向量可能是最好的解决方案。在尺寸不一致的情况下,将尺寸变化最大的尺寸作为最后一个尺寸。此外,在嵌套向量解决方案中,将小维度放在首位通常是一个好主意。
我对使用的主要关注点是vector<vector<vector<A> > >
确保二级和三级向量都具有与传统 3D 数组中相同的长度,因为数据类型中没有任何内容可以强制执行这一点。我不是很熟悉boost::multi_array
,但看起来这不是问题 - 你可以resize()
整个数组,但除非我弄错了,否则你不能不小心从第三行删除一个项目并让它保持不同的大小比所有其他行(例如)。
因此,假设文件大小和编译时间等问题不是什么大问题,我想你会想要boost::multi_array
. 如果这些事情是个问题,您可能需要考虑使用普通的 3D 阵列,因为这应该在这些区域中击败其他两个选项中的任何一个。