我在找出代表这一点的最好方法时遇到了一些麻烦。
最初我有一个大小为N x N的2D矢量,其中每个元素都是glm :: vec2。我把它初始化为:
//initialize vector
std::vector < std::vector < glm::vec2>> Gvectors;
//allocate space
Gvectors.resize(nGridCells + 1, std::vector<glm::vec2>(nGridCells + 1, glm::vec2(0.0f)));
//fill data
for (size_t i = 0; i < nGridCells+1; i++)
{
for (size_t j = 0; j < nGridCells+1; j++)
{
float dx = something;
float dx = something else;
Gvector[i][j] = glm::normalize( glm::vec2(dx, dy));
}
}
不,我想要多个具有所有不同尺寸的2D矢量。它们中的每一个都有不同的尺寸,通常在10x10到100x100的范围内。
所以我想创建另一个嵌套向量,所以它会像:
std::vector<std::vector <std::vector < std::vector < glm::vec2>>> Gvectors;
但是当试图弄清楚如何使用resize为三向量分配空间时,我读到嵌套向量对于内存分配来说可能很麻烦,使用标准数组通常会更好。 但是,如果我使用数组,我认为我会遇到问题,因为我的每个2D数组都有不同的大小。
我猜我在问什么,代表这个的最好方法是什么。基本上是2D矢量的矢量或2D阵列的阵列。我也试图制作一组2D矢量,但是想象这不是最好的方法。
仅供参考,初始化后矢量的大小不会改变。
提前致谢!
答案 0 :(得分:1)
一般来说,给事物命名是个好主意。
假设您调用2D矢量,例如矩阵,然后
std::vector<Matrix> matrices;
是一种合理的方式来表示矩阵的数量及其大小和内容在运行时可能会有所不同。
另一方面,如果您希望表示此信息在初始化后的运行时没有变化,那么请使用const
并添加初始值设定项,例如
std::vector<Matrix> const matrices = something;
如何定义像Matrix
这样的类肯定会被很多SO问题所覆盖,但是简单的搜索并没有找到它。它应该在SO C ++数组常见问题解答中,但在那里回答它需要讨论无数细节。所以,简而言之,最合理的方式是IMO
使用std::vector
进行存储,并跟踪矩阵大小,
定义一个非公共成员函数index_of
,它为给定的行/列位置提供线性数组索引,并且
提供用于访问的公共成员函数,例如item
,at
,operator()
。
相反,如果您选择定义operator[]
进行访问,只是让它返回指针,那么您就不需要index_of
而且效率更高,但您输了能够对列索引进行范围检查,并且您失去了在列索引上设置断点的一般能力。因此,它是一种不太通用,不太可重复使用的解决方案。不过,它作为一种选择,你可以同时拥有它们。