【发布时间】:2020-11-27 19:13:49
【问题描述】:
给定一个 int 向量的向量(例如),以下代码允许我将平面位置映射到二维索引并访问该元素:
int x = 0, y = 0, acc = 0;
while ((acc = myVector[x].size()+acc) <= position) {
x++;
y= acc;
}
y = position - y;
我想知道是否有一种方法可以使用单个指针遍历我的二维向量的所有元素,从而将其增加位置编号。
编辑1:
std::vector<std::vector<int>> myVector;
myVector.emplace_back();
for (int i = 0; i < 10; i++) {
myVector[0].emplace_back(0);
}
myVector.emplace_back();
for (int i = 0; i < 5; i++) {
myVector[0].emplace_back(1);
}
myVector.emplace_back();
for (int i = 0; i < 8; i++) {
myVector[0].emplace_back(2);
}
for (auto row : myVector) {
for (auto col : row) {
std::cout << col << std::endl;
}
}
我需要创建一个指向myVector[0][0] 指向的第一个元素的指针,然后在第一行的末尾和下一行的开头之间创建一个链接,以便我可以使用单个指针对其进行迭代。
如果我需要位置 12 的元素,那么只需增加指针,我就可以获得位置 (1,1) 的元素。
基本上我正在尝试使用 std::vectors 来模拟 c 数组的行为
【问题讨论】:
-
请创建一个minimal reproducible example 并展示一些代码应该做什么的示例。
-
你需要什么?如果将其用作 1D 平面向量,为什么会有 2D 向量?一周(或一小时后)你和其他人都不会理解这段代码......
-
这在 C 风格的数组中是可能的,因为它们直接彼此相邻地存储在内存中。通过使用类,例如
std::vector,会存储其他成员变量,例如长度,因此在主向量的每个子向量之间,会有你不想迭代的东西。 -
安东尼奥,布莱尔回答了你很好的解决方案。您对指针的渴望有一个问题:向量可以在修改后更改内存块(您不应该使用固定指针)。还有那些你应该存储在某个地方的指针链接。
-
“我正在尝试模拟 c 数组的行为” -- 不过,行为上有一个关键区别。您的向量不能保证具有相同的长度,而 2D 数组在次要维度中必须具有统一的长度。对于更复杂的情况,您应该期待更复杂的解决方案。
标签: c++ algorithm pointers vector iterator