如何在C++中通过用户输入初始化二维vector?使用insert遇段错误
问题分析与修复方案
错误根源
你的代码触发段错误的核心原因是:
- 初始化的二维
vector<vector<int>> v是空容器(v.size() == 0),第一个循环中直接通过v[i]访问第i行时,容器内根本不存在对应元素,属于越界访问,直接触发未定义行为(段错误是典型表现)。 - 即便解决了行的问题,你提前保存的迭代器
it在insert操作后会失效(vector插入元素可能导致内存重分配),后续使用it+j也会引发问题。
修复方案
方案1:预分配行后插入元素
先给二维vector初始化指定数量的空行,再逐行插入元素,同时每次插入前重新获取迭代器避免失效:
#include <iostream> #include<vector> using namespace std; int main() { int rowsa=2; int colsa=2; vector<vector<int>> v(rowsa); // 预分配rowsa个空行 int temp=0; cout<<"Enter the matrix values row wise: "<<endl; for(int i=0; i<rowsa; i++) { for(int j=0; j<colsa; j++) { cin>>temp; auto it = v[i].begin(); // 每次插入前重新获取迭代器 v[i].insert(it + j, temp); } } cout<<"Entered matrix is: "<<endl; for(int i=0;i<rowsa;i++) { for(int j=0;j<colsa;j++) { cout<<v[i][j]<<" "; } cout<<endl; } return 0; }
如果只是往行末尾插入元素,用push_back更高效且无需处理迭代器:
v[i].push_back(temp); // 替代insert操作
方案2:逐行创建后添加到二维vector
每次循环创建独立的一维vector,插入元素后再将整行添加到二维容器中:
#include <iostream> #include<vector> using namespace std; int main() { vector<vector<int>> v; int rowsa=2; int colsa=2; int temp=0; cout<<"Enter the matrix values row wise: "<<endl; for(int i=0; i<rowsa; i++) { vector<int> current_row; for(int j=0; j<colsa; j++) { cin>>temp; current_row.insert(current_row.begin() + j, temp); } v.push_back(current_row); // 将整行加入二维vector } cout<<"Entered matrix is: "<<endl; for(int i=0;i<rowsa;i++) { for(int j=0;j<colsa;j++) { cout<<v[i][j]<<" "; } cout<<endl; } return 0; }
内容的提问来源于stack exchange,提问作者Vinay
相关产品推荐
相关产品推荐

