c++ 2D矢量SIGSEV错误

C++ 2D vector SIGSEV error

本文关键字:错误 SIGSEV 矢量 2D c++      更新时间:2023-10-16

我在下面的代码中得到分割错误,有人可以费心解释一下吗?我认为它可能与初始化有关,但不确定。我只是试图克隆现有堆栈并执行操作,例如向克隆添加条目或从现有条目中删除条目并将其克隆到新堆栈。

#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <deque>
#include <string>
using namespace std;
#define in cin
#define out cout
int main()
{
    //ifstream in("postfix.in");
    //ofstream out("postfix.out");
    int n;
    in>>n;
    long sum=0;
    vector<int> tm(0);
    vector<vector<int>> ar(0,tm);
    //ar[0].push_back(0);
    out<<ar[0][0];
    for(int i=0;i<n;i++)
    {
        int ind,val;
        in>>ind>>val;
        if(val==0)
        {
            for(int j=0;j<ar[ind-1].size();j++)
            ar[i].push_back(ar[ind-1][j]);
            ar[i].pop_back();
        }
        else
        {
            for(int j=0;j<ar[ind-1].size();j++)
            ar[i].push_back(ar[ind-1][j]);
            ar[i].push_back(val);
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<ar[i].size();j++)
        sum+=ar[i][j];
    }
    out<<sum<<endl;
    return 0;
}
vector<int> tm(0);
vector<vector<int>> ar(0,tm);

这里将ar初始化为int向量的向量。如果不通过push_back(), resize(), insert()等扩大其大小,则无法访问ar[i]

可以将ar初始化为

vector<vector<int>> ar(n);

但是在您提供的现有代码片段中,没有提示第二次元应该有多大。

根据你在这个回答中的评论,你的tmar的声明应该是

vector<int> tm(1, 0);
vector<vector<int>> ar(1, tm);

或者更短,因为tm之后并不真正使用,

vector<vector<int>> ar(1, vector<int>(1, 0));

我想我知道你在哪里出错了。

vector<int> tm(0);

不能创建包含0的向量。这创建了一个大小为0的向量。因为这个列表的大小是0,你不能得到第一个元素;因为它是空的!

相同:

vector<vector<int>> ar(0,tm);

这不会创建一个只有"一行"的向量。它将创建一个空向量,因为您再次将大小设置为0。

你的意思可能是:

vector<int> tm(1, 0);
vector<vector<int>> ar(1,tm);

创建一个行,tm,只有一个0,然后创建一个2D向量,ar,包含这一行。

检查引用。您正在尝试使用"fill"构造函数

对于初学者来说,使用这样的定义是一个坏主意

#define in cin
#define out cout

最好显式地使用std::cinstd::cout,因为任何程序员都知道这些名称的含义。

这些声明

vector<int> tm(0);
vector<vector<int>> ar(0,tm);

没有太大意义。直接写

会更清楚更简单
vector<int> tm;
vector<vector<int>> ar;

所以当向量为空时,你可以不使用下标操作符,比如这里

out<<ar[0][0];
     ^^^^^^^^^
for(int i=0;i<n;i++)
{
    int ind,val;
    in>>ind>>val;
    if(val==0)
    {
        for(int j=0;j<ar[ind-1].size();j++)
                    ^^^^^^^^^^^ 
        ar[i].push_back(ar[ind-1][j]);
        ^^^^^
        ar[i].pop_back();
        ^^^^^
    }

等等。在使用下标操作符之前,首先需要向vector对象添加新元素。