初始化三维向量c++; 我试图在C++中启动一个3D向量。我希望它最初是100乘100乘1,但我遇到了问题。(我知道这基本上是2d,但稍后我将调整z轴向量的大小。)

初始化三维向量c++; 我试图在C++中启动一个3D向量。我希望它最初是100乘100乘1,但我遇到了问题。(我知道这基本上是2d,但稍后我将调整z轴向量的大小。),c++,class,vector,initialization,C++,Class,Vector,Initialization,我有一个类,实体,向量应该包含指向它的指针。我已经正确地包含了实体向量头,但它仍然不起作用。以下是我想做的: vector <vector <vector <Entity* > > > matrix (100, vector < vector < Entity* > > (100,vector<Entity*> (1, NULL))); 向量矩阵(100,向量(100,向量(1,NULL)); 编译器给出的错误是“数字常

我有一个类,实体,向量应该包含指向它的指针。我已经正确地包含了实体向量头,但它仍然不起作用。以下是我想做的:

vector <vector <vector <Entity* > > > matrix (100, vector < vector < Entity* > > (100,vector<Entity*> (1, NULL)));
向量矩阵(100,向量>(100,向量(1,NULL));
编译器给出的错误是“数字常量之前的预期标识符”。我仔细检查了一下,在这行之前没有缺少分号或任何东西。如果我删除这一行,代码就会编译得很干净

这直接位于函数定义中的“private:”行之后。成员变量可以接受构造函数吗?我也试着把它放在

vector <vector <vector <Entity* > > > matrix;
向量矩阵;
在.h文件中,以及

matrix (100, vector < vector < Entity* > > (100,vector<Entity*> (1, NULL)));
矩阵(100,向量>(100,向量(1,NULL));
在.cpp文件的构造函数中,但这也不起作用(调用不匹配,从int到Entity*的转换无效)

声明3d“向量”的最佳方法是什么(尤其是在类中?)


谢谢

您需要在类构造函数中初始化它

class MyClass
{
public:
    MyClass()
        : matrix (100, vector < vector < Entity* > > (100,vector<Entity*> (1, NULL)))
    {}

private:
    vector <vector <vector <Entity* > > > matrix;
};
class-MyClass
{
公众:
MyClass()
:矩阵(100,向量>(100,向量(1,NULL)))
{}
私人:
向量矩阵;
};
就我个人而言,我不会将向量的向量用于矩阵,正如我在下面的帖子中所讨论的:

我建议您采用类似的方法,但适用于3D矩阵。基本上,您将前两个维度视为一个矩形(在本例中为正方形),然后将这些矩形堆叠起来以创建第三个维度。如果要将第三维尺寸调整为10个元素,则需要再添加9块100x100。这将是一个单一的向量大小调整操作


如果要使用矢量执行上述调整大小操作,则需要执行10000个矢量调整大小操作。您将把元素存储扩展到整个堆中,并由于缓存未命中而获得糟糕的性能。

vector>dp(m,vector(n,vector(l,1))

要意识到,由于单独的分配,您将获得糟糕的数据局部性。如果性能成为问题,考虑一个大向量和手动计算偏移量。此外,如果向量“拥有”每个元素,则更喜欢原始指针的
std::unique_ptr
std::shared_ptr
。使用二维向量数组是否存在内存问题?问题不在于使用多少内存,而在于内存分配到哪里。每个向量将分配它自己的内存堆,这意味着在它们上迭代将使您在内存中跳跃(从而导致许多缓存未命中)。不过,首先要确定这确实是一个问题。如果我有一个2d向量数组,那么它在内存中的处理是否像堆分配内存的2d指针数组一样?@Nathan no-每个向量都是一个类,有自己的成员和堆上分配的一堆内存。通常,它分配的内存比它需要的要多,但如果您在构造函数中指定它,则应该是确切的内存量。但这意味着您需要为类成员提供存储空间。这不仅仅是指针,我在这个例子中内联了构造函数(即定义和声明在同一个位置)。您可以在CPP文件中定义构造函数,如下所示:
MyClass::MyClass():matrix(…){}
。为了简洁起见,我使用了
。在这种情况下,类中的声明就是:
MyClass()。也许你应该找到一个关于C++的入门教程,即使你在这里修改了格式,这样语法就不会被破坏,……虽然这段代码可能会解决这个问题,但它如何以及为什么解决这个问题会真正有助于提高你的文章的质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。