提问人:Steven Kraine 提问时间:11/11/2022 更新时间:11/11/2022 访问量:69
指向矢量的指针会产生 3D 矢量?
pointer to pointer of vector yields 3D vector?
问:
我一直在浏览一些遗留代码,发现了这个小片段:
std::vector<int>** grid = new std::vector<int>*[10];
for (int k = 0; k < 10; k++)
grid[k] = new std::vector<int>[10];
然后,原始开发人员在此处调用此命令:
grid [i][j].push_back(temp);
我的印象是 会返回嵌套向量中的值,但使用 意味着该位置有一个指向向量的指针?我很困惑这第三个向量是从哪里来的。[i][j]
push_back
另外,有没有更好的方法?三元组嵌套向量是否也能获得与上述代码相同的结果?
提前致谢!
答:
1赞
Ben
11/11/2022
#1
我认为您的困惑在于,有两个维度由指针组成,一个维度由向量组成。
总共有 100 个带整数的向量。
grid[] -> contains 10 pointers which each point to an array of vector pointers
grid[][] -> contains 10 pointers to vectors
*grid[][] -> a vector of integers
评论
0赞
Caleth
11/11/2022
OP 代码具有空向量
3赞
Caleth
11/11/2022
#2
你所拥有的是由不懂C++的人写的一堆烂摊子。
grid[i][j]
是对 .std::vector<int>
另外,有没有更好的方法?三元组嵌套向量是否也能获得与上述代码相同的结果?
是的。std::vector<std::vector<std::vector<int>>> grid { 10, { 10, {} } };
但是,如果要确保每个元素中的元素数量相等,则应使用矩阵类。
somelib::matrix<std::vector<int>> grid(10, 10); // probably only does one allocation of 100 vectors
评论
1赞
nick
11/11/2022
所以最初的编码员知道 std::vector,但仍然将一个放入原始数组中。我只是。。。。寺院??
3赞
rturrado
11/11/2022
#3
grid[i][j]
是对 .std::vector<int>
重写内容可能会澄清你所拥有的。
#include <fmt/ranges.h>
#include <vector>
int main() {
using line_t = std::vector<int>; // line is a vector of ints
using matrix_t = line_t*; // matrix is an array of lines
using grid_t = matrix_t*; // grid is an array of matrices
// Same as: grid_t grid{ new std::vector<int>*[3] };
grid_t grid{ new matrix_t[3] };
int v{};
for (int k = 0; k < 3; k++) { // we walk each matrix
auto& matrix{ grid[k] };
matrix = new line_t[3];
for (int l = 0; l < 3; l++, v++) { // we walk each line
// Same as: auto& line{ grid[k][l] };
auto& line{ matrix[l] };
line = std::vector<int>(3, v);
}
}
fmt::print("Grid\n\n");
for (int k{0}; k < 3; k++) {
fmt::print("Matrix {}\n", k);
auto& matrix{ grid[k] };
for (int l{0}; l < 3; l++) {
auto& line{ matrix[l] };
fmt::print("{}\n", line);
}
fmt::print("\n");
}
}
// Outputs:
//
// Grid
//
// Matrix 0
// [0, 0, 0]
// [1, 1, 1]
// [2, 2, 2]
//
// Matrix 1
// [3, 3, 3]
// [4, 4, 4]
// [5, 5, 5]
//
// Matrix 2
// [6, 6, 6]
// [7, 7, 7]
// [8, 8, 8]
使用 s 而不是内置数组会大大简化事情。std::vector
#include <algorithm> // fill
#include <fmt/ranges.h>
#include <vector>
int main() {
using line_t = std::vector<int>; // line is a vector of ints
using matrix_t = std::vector<line_t>; // matrix is a vector of lines
using grid_t = std::vector<matrix_t>; // grid is a vector of matrices
grid_t grid(3, matrix_t(3, line_t(3)));
int v{};
for (auto& matrix : grid) {
for (auto& line : matrix) {
std::ranges::fill(line, v++);
}
}
fmt::print("Grid\n\n");
for (int k{0}; k < 3; k++) {
fmt::print("Matrix {}\n", k);
fmt::print("{}\n\n", fmt::join(grid[k], "\n"));
}
}
评论
temp
->push_back
.push_back
grid [i][j]
temp
int
push_back
std::vector<int>** grid
说那是指向指向 a 的指针,所以这正是应该不足为奇的。grid
std:vector<int>
grid