使用大小和值初始化3D std :: vector

时间:2016-03-22 01:02:12

标签: c++ vector std

我在宣布尺寸为200×200×200的3D std :: vector时遇到了一些困难。我可以在SO上看到关于设置大小的问题并用值初始化它,但所有都是针对1D向量的。

我试着从像

这样的东西开始
vector<vector<vector<uchar>>> vsfl(200,200,200,1);

但有编译错误。

我最初是从uchar vsfl [200] [200] [200]开始的,但导致了堆栈溢出错误

感谢一帮!

3 个答案:

答案 0 :(得分:2)

与1D向量相同,但您必须稍微更改参数:

vector<vector<vector<int>>> vsfl(200, vector<vector<int>>(200, vector<int>(200, 1)));

因为std::vector构造函数将T作为第二个参数并且它是一个3D向量,所以如果要初始化它,则必须调用T的构造函数。

答案 1 :(得分:0)

回到你开始的地方,但是在函数外部移动声明,你不会得到堆栈溢出错误。堆栈的内存太多了。

如果你正在编写的代码在一个方法中,那么将它移到函数之外会导致对象变大 - 如果你在一个函数中声明该对象,你会得到同样的问题。此时,您可以将对象声明移到函数外部,或者将其移动。

如果您需要,另一种选择是:

struct BigArray { int elems[200][200][200]; };
//be sure to delete me!
BigArray *test = new BigArray;

答案 2 :(得分:-1)

首先,选择要使用的容器。如果每个容器的大小在编译时是已知的,例如你的情况似乎是,并且它永远不会改变,那么使用普通的旧数组。

否则,你想要一个矢量。在算法方法中,你想要的是用200个向量初始化的向量,用200 uchar s初始化的200个向量初始化,无论uchar是什么。

所以,为了做到这一点,你可以使用......

template<typename T>
using unidimensional_vector = std::vector<T>;

template<typename T>
using bidimensional_vector = std::vector<unidimensional_vector<T>>;

template<typename T>
using tridimensional_vector = std::vector<bidimensional_vector<T>>;

tridimensional_vector<uchar> my_vector(200, bidimensional_vector<uchar>(200, unidimensional_vector<uchar>()));