2014-09-12 42 views
0

我正在实现一个3维数组。很像Excel文档的单元格和表单。 x和y是页面大小,z是页数。现在,每个页面的x和y索引可以相同。C++中的3维数组

我想用向量(让我们现在只是说只有字符串),以接近这一点,但它声明如下:

std::vector<std::string> sheets; 
//x and y being the x-y coordinates and z being the number of pages. 
int size = x*y*z; 
sheets.reserve(size); 

因此给了我一个很好的一段连续的内存(如的定义std :: vector),这是快速和高效的。

我的问题是:是否有这样做与std ::数组的方式? 有没有一种方法可以在创建对象时创建数组大小,还是必须在编译时知道这一点?

class sheetsObj 
{ 
    int x, y, z; 
    int size; 
    //Where size is x * y * z. 
    std::array<std::string, size> sheets; 
public: 
    sheetsObj(int xInd, int yInd, int zInd) : x{ xInd }, y{ yInd }, z{ zInd } {}; 
    .... 
} 

在此先感谢。

+2

对于'std :: array',编译时必须知道大小。为什么你要使用'std :: array'呢?我怀疑'x * y * z'可能会对堆栈有点大。 – BoBTFish 2014-09-12 15:23:14

+2

'std :: array'需要在编译时知道大小。如果您愿意,您可以使用“模板”来指定大小。 – 2014-09-12 15:24:14

回答

2

最好的经验法则是当你需要时使用std::vector,必要时使用std::array。在这种情况下,std::vector是您的最佳选择。正如你所说,编译时必须知道std::array的大小,所以如果你需要动态大小的存储,这是一个不容忽视的问题。

+0

嗡嗡声,我想这是另一种方式:当你可以使用'std :: array'时(即当你知道编译时的大小),否则使用'std :: vector'。你能否赞成你的这个经验法则? – gurka 2014-09-12 18:35:53

+1

当然,std :: vector是一个更灵活的数据类型,它更容易响应不断变化的需求。它通常会使编程变得更容易,这总是令人满意的。在堆分配很昂贵的环境中工作时,使用std :: array会很好,或者您已经对代码进行了剖析并发现'vector's引发了一个问题。否则,它通常是不成熟的优化。 – TartanLlama 2014-09-12 20:20:40

1

std::array它的大小由模板参数确定,因此在编译时评估,可能不适合您的需求(除非所有工作表都设计为永远具有相同的大小?)。

A std::vector将完全满足您的要求,因为您的程序不使用调整大小的开销,并且您将根据需要获取内存块。

std::dynarray可能是您使用的最好的类,因为它代表了一个运行时可初始化的数组,它在其生命周期中保持固定大小。然而,最初计划随C++ 14标准发布,投票已将其排除在即将出台的标准之外,稍后将其提交到单独的技术规范中。