指向矢量的指针会产生 3D 矢量?

pointer to pointer of vector yields 3D vector?

提问人:Steven Kraine 提问时间:11/11/2022 更新时间:11/11/2022 访问量:69

问:

我一直在浏览一些遗留代码,发现了这个小片段:

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

另外,有没有更好的方法?三元组嵌套向量是否也能获得与上述代码相同的结果?

提前致谢!

C++ 向量 std stdvector

评论

0赞 273K 11/11/2022
什么?这是指向向量的指针吗?temp
0赞 UnholySheep 11/11/2022
不,它不是指向向量的指针。然后,您必须使用 而不是 . 为您提供矢量对象本身->push_back.push_backgrid [i][j]
0赞 Ben 11/11/2022
@273K,应为 .调用在向量上。tempintpush_back
2赞 sweenish 11/11/2022
该代码是垃圾箱火灾。
0赞 molbdnilo 11/11/2022
std::vector<int>** grid说那是指向指向 a 的指针,所以这正是应该不足为奇的。gridstd:vector<int>grid

答:

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"));
    }
}