c++ - 在 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;
}
编译没有错误,但是当我尝试运行时它什么也没显示。如何解决这个问题?
解决方案
当您编写 时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()
,它执行相同的功能,但如果索引超出范围,则会引发异常。这对调试非常有帮助。
推荐阅读
- python - 如何从 QTableWidget 列中获取行数据?
- javascript - 我如何处理响应式菜单?
- scala - 如何在 scala sbt 框架中使用 TestNG?
- ubuntu - wsl:不使用 sudo 挂载 - 权限被拒绝
- node.js - 为什么会出现这个语法错误 internal/modules/cjs/loader.js:584 throw err; ^?
- interface - 如何解决 OCaml 循环构建错误?
- python - 如何使用 Win32com 查找和替换。我的代码不会执行替换
- c# - 替换IIS中域URL的一个单词
- python - 如何将 httpie 与 httpie-aws-authv4 捆绑到 Python zipapp 中?
- android - 在服务中使用通过 Intent 选择器检索到的 Uri