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

initialize 3D std::vector with size and value

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

我试着从类似

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

但是有编译错误。

我最初使用 uchar vsfl[200][200][200] 开始,但导致堆栈溢出错误

非常感谢!

它和一维向量是一样的,但是你必须稍微改变一下参数:

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

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

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

如果您正在编写的代码是在一个方法中,那么将它移到函数之外会导致对象变大——如果您在函数内部声明该对象,您也会遇到同样的问题。那时,您可以将对象声明移到函数外,或新建它。

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

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

首先,select您想使用什么容器。如果 每个 容器的大小在编译时是已知的,就像你的情况一样,并且它永远不会改变,那么使用普通的旧数组。

否则,你需要一个向量。在算法上,你想要的是用 200 个向量初始化一个向量,用 200 个向量初始化 200 个 uchars,无论 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>()));