【问题标题】:Initializing 3d vectors c++初始化 3d 向量 c++
【发布时间】:2013-05-10 16:29:35
【问题描述】:

我正在尝试在 C++ 中启动 3d 矢量。我希望它最初是 100 x 100 x 1,但我遇到了问题。 (我知道这基本上是 2d,但我稍后会调整 z 轴向量的大小。)

我有一个类,Entity,它的向量应该包含一个指向的指针。我已正确包含实体向量标头,但它仍然无法正常工作。这是我正在尝试做的事情:

vector <vector <vector <Entity* > > > matrix (100, vector < vector < Entity* > > (100,vector<Entity*> (1, NULL)));

编译器给出的错误是“数字常量之前的预期标识符”。我仔细检查,在这行之前没有丢失分号或任何东西。如果我删除这一行,代码就会编译干净。

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

vector <vector <vector <Entity* > > > matrix;

在 .h 文件中,并且

matrix (100, vector < vector < Entity* > > (100,vector<Entity*> (1, NULL)));

在 .cpp 文件的构造函数中,但这也不起作用(调用不匹配,并且从 int 到 Entity* 的转换无效)

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

谢谢!

【问题讨论】:

  • 意识到由于单独的分配,您将获得糟糕的数据局部性。如果性能成为问题,请考虑使用一个大向量并手动计算偏移量。此外,如果向量“拥有”每个元素,则首选 std::unique_ptr 或 std::shared_ptr 而不是原始指针。
  • 使用二维向量数组是否存在内存问题?
  • 这与您使用了多少 内存无关,而与分配内存的何处 有关。每个向量都将分配自己的内存堆,这意味着对它们进行迭代将使您在内存中四处游荡(从而导致许多缓存未命中)。不过,请先确保这对您来说确实是个问题。
  • 如果我有一个二维向量数组,它在内存中的处理方式是否像指向堆分配内存的二维指针数组一样?
  • @Nathan no - 每个向量都是一个类,它有自己的成员和一堆在堆上分配的内存。通常它分配的内存比它需要的多,但如果你在构造函数中指定它应该是确切的数量。但这意味着您需要为班级成员提供存储空间。这不仅仅是指针。

标签: c++ class vector initialization


【解决方案1】:

你需要在你的类构造函数中初始化它。

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

private:
    vector <vector <vector <Entity* > > > matrix;
};

就我个人而言,我不会将向量的向量用于矩阵,正如我在以下帖子中所讨论的:

Get the first column of a matrix represented by a vector of vectors

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

如果您想使用矢量-矢量-矢量进行上述调整大小,则需要执行 10,000 次矢量调整大小操作。您会将元素存储分散到整个堆中,并且由于缓存未命中而获得糟糕的性能。

【讨论】:

  • 我已经在这个例子中内联了构造函数(ie定义和声明在同一个地方)。您可以像这样在 CPP 文件中定义构造函数:MyClass::MyClass() : matrix( ... ) {}。为简洁起见,我使用了...。在这种情况下,类中的声明很简单:MyClass();。也许你应该找到一个关于 C++ 的入门教程
【解决方案2】:

向量>dp(m,向量(n,向量(l,1)));

【讨论】:

  • 即使你在这里修复了格式,这样语法不会被破坏,...
  • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。
猜你喜欢
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多