我在宣布尺寸为200×200×200的3D std :: vector时遇到了一些困难。我可以在SO上看到关于设置大小的问题并用值初始化它,但所有都是针对1D向量的。
我试着从像
这样的东西开始vector<vector<vector<uchar>>> vsfl(200,200,200,1);
但有编译错误。
我最初是从uchar vsfl [200] [200] [200]开始的,但导致了堆栈溢出错误
感谢一帮!
答案 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>()));