返回二维向量的结束索引

Posted

技术标签:

【中文标题】返回二维向量的结束索引【英文标题】:Return end index of a 2D Vector [closed] 【发布时间】:2014-01-19 14:34:02 【问题描述】:

例如,我创建一个 2D 矢量 (1000x3) 为:

vector<vector<float>> Vector (1000, vector<float>(3))

然后一个函数将 3D 点存储到向量中(不一定是 1000 个点,但少于 1000 个)。我应该如何获取我创建的 Vector 中最后一行的索引?

我想出了一个在向量类中定义的称为“end”的方法,但不知道语法。

也有人会说,我可以追踪存储在向量中的最后一个点的索引,例如:

Vector[i][j] = value;

但是我在其他函数中需要这些数据,所以一直返回这个索引对我来说似乎不是一个好的选择。

【问题讨论】:

改为创建一维向量并包装索引访问! 如果你在堆上创建这些大向量会更好。 @Cool_Coder 不,这没有任何意义。 与问题无关,只是一个建议。 @Cool_Coder 这是一个不好的建议。 【参考方案1】:

你不应该用 1000 个元素来初始化它。留空,使用 Vector.push(...) 添加新点,向量会自动增长。

那么最后一个索引是:

Vector.size() - 1

或者如果你坚持这样做,你可以把它放在一个类中,并添加一个成员来存储大小。

struct PointVector 
    vector<array<float, 3>> Vector;
    int size;
    PointVector() : Vector(1000, 0, 0, 0), size(0)  
;

【讨论】:

感谢您的输入。我初始化空间来存储 1000 个点,因为否则在每次 push_back 之后,都会重新分配。虽然我会检查你的第二个建议。【参考方案2】:

由于每一行都是一个 3D 点,因此肯定会有 3 个元素,std::vector 不是合适的类型。对于内部类型,我可能会使用 std::array&lt;float, 3&gt;struct 成员 xyz

看来您实际上并不希望向量中有 1000 个点。也许您这样做是为了避免以后重新分配?在这种情况下,您应该使用Vector.reserve(1000);。这将为点保留内存而不实际添加它们。然后您可以使用emplace_backpush_back 或任何其他机制添加您的积分。

然后,要获得指向向量中最后一点的迭代器,您可以使用std::end(Vector) - 1Vector.end() - 1。如果你保持原样,向量中总是有 1000 个点,这会给你一个迭代器到第 1000 个点(即使你还没有给它分配任何有用的值)。

【讨论】:

感谢您的输入。是的你是对的。我为 1000 个点创建了空间,因为我不想在每次 push_back 后重新分配。但是当我使用 Vector.reserve (1000) 时如何声明向量。应该声明该向量包含 3 列(即使我知道没有像列这样的东西)。那么,你能告诉我如何声明向量吗? 如果您有一个名为Pointstructstd::vector&lt;Point&gt; Vector;。如果你想使用std::arraystd::vector&lt;std::array&lt;float, 3&gt;&gt; Vector;。然后在下一行调用Vector.reserve(1000); '然后,要获得指向向量中最后一点的迭代器,您可以执行 std::end(Vector) 或 Vector.end()' - 实际上已经过了最后一点。

以上是关于返回二维向量的结束索引的主要内容,如果未能解决你的问题,请参考以下文章

分段错误:从二维向量中随机删除元素

高效返回二维向量

返回二维向量

计算二维向量叉积

检查二维向量中的邻居周围坐标时返回的值不正确

在我给二维向量赋予第一个值后控制台关闭