You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 03:17:33