使用多维向量或数组

Working with multidimensional vectors or arrays

本文关键字:数组 向量      更新时间:2023-10-16

我很难找到表示这一点的最佳方式。

最初,我有一个大小为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矢量称为矩阵,那么

std::vector<Matrix> matrices;

是一种合理的方式来表示矩阵的数量、大小和内容可以在运行时发生变化。

另一方面,如果您想表示该信息在初始化后的运行时不会发生变化,那么使用const并添加一个初始化器,如

std::vector<Matrix> const matrices = something;

如何定义像Matrix这样的类肯定会有很多SO问题,但简单的搜索并没有找到它。它确实应该在SO C++数组FAQ中,但在那里回答它需要讨论无数细节。总之,最合理的方法是IMO

  • 使用std::vector进行存储,并跟踪矩阵大小

  • 定义一个非公共成员函数index_of,它为给定的行/列位置提供线性数组索引,以及

  • 为访问提供公共成员功能,如itematoperator()

相反,如果您选择定义一个operator[]进行访问,并让它返回一个指针,那么您就不需要index_of,它可以更高效,但您将失去对列索引进行范围检查的能力,也将失去在列索引上设置断点的一般能力。因此,这是一个不太通用、可重复使用性较差的解决方案。尽管如此,它仍然是一种选择,你可以两者兼得。