首页 > 解决方案 > 在 C++ 中初始化二维向量

问题描述

所以,我在 C++ 中有以下代码:

这是二维向量:

vector<vector<int>> adj;

二维向量的初始化:

adj[0].push_back(1);
adj[0].push_back(2);
adj[1].push_back(3);
adj[1].push_back(4);
adj[1].push_back(5);

打印矢量:

for(auto i : adj) {
    for(auto j : i)
        cout << j << " ";
    cout << endl;
}

编译没有错误,但是当我尝试运行时它什么也没显示。如何解决这个问题?

标签: c++vector

解决方案


当您编写 时adj[0],您隐含地假设向量的大小至少为 1,以使第零个元素存在。这不是空向量的情况,例如新初始化的向量。不幸的是,这并不能保证任何类型的错误,它是未定义的行为,并且允许编译器让任何事情发生。为了避免这种情况,您需要为这些元素腾出空间,这可以通过多种方式完成:

adj.resize(2); // now size == 2, and [0] and [1] can be safely accessed
adj[0].push_back(1);
adj[1].push_back(3);

或者

adj.push_back({}); // append default-constructed vector
adj.back().push_back(1); // append 1 to the above vector

或者,也许最简洁:

adj = {
    {1, 2},
    {3, 4, 5}
};
// adj now contains two vectors containing {1, 2} and {3, 4, 5} respectively

如果要使用下标[]运算符对向量进行索引访问,请考虑使用vector.at(),它执行相同的功能,但如果索引超出范围,则会引发异常。这对调试非常有帮助。


推荐阅读