如何使用1d索引对2d向量进行迭代



给定一个向量为int的向量(例如(,下面的代码允许我将平面位置映射到2d索引中并访问元素:

int x = 0, y = 0, acc = 0;
while ((acc = myVector[x].size()+acc) <= position) {
x++;
y= acc;
}
y = position - y;

我想知道是否有一种方法可以使用一个指针迭代我的2d向量的所有元素,从而将其乘以位置号。

第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数组的行为

在c++20中,使用<ranges>标头可以直接支持此功能。所以你可以简单地做:

namespace srv = std::ranges::views;
for (auto i : myVector | srv::join)
std::cout << i << std::endl;

这是一个演示。

使用range-v3,您可以对连接视图进行vector,如下所示:

namespace rv = ranges::views;

auto j = myVector | rv::join | ranges::to<std::vector<int>>;

然后索引到任意位置。

这是一个演示。

编写自己的容器类,它可以执行以下操作:

  1. 以向量中的一个向量作为构造函数参数。将矢量地址中的矢量存储为其成员
  2. 实现get(size_t p(以进行如下迭代:
size_t i;
for (i = 0; i < v.size() && p > v[i].size(); i++)
{
p -= v[i].size();
}
return v[i][p];
  1. 过载[]指向

我想知道是否有一种方法可以使用单指针迭代2d向量的所有元素

没有,没有。你不能假设第一个向量的元素后面跟着第二个向量的元件,等等

相反,您可以使用std::vector<int>来连续存储所有元素,然后将std::vector<std::span<int>>构造为";2d";

std::vector<int> raw;
for (int i = 0; i < 10; i++) {
raw.emplace_back(0);
}
for (int i = 0; i < 5; i++) {
raw.emplace_back(1);
}
for (int i = 0; i < 8; i++) {
raw.emplace_back(2);
}
std::vector<std::span<int>> myVector;
myVector.emplace_back(raw.data(), 10);
myVector.emplace_back(raw.data() + 10, 5);
myVector.emplace_back(raw.data() + 15, 8);
for (auto row : myVector) {
for (auto col : row) {
std::cout << col << std::endl;
}
}

实时查看

最新更新