C ++ 2D矢量SIGSEV错误

时间:2016-11-11 15:28:44

标签: c++ vector segmentation-fault

我在以下代码中遇到分段错误,任何人都可以解释。我认为它可能与初始化有关,但不确定。我只是尝试克隆现有的堆栈并执行操作,例如向克隆添加条目或从现有条目中删除条目并将其克隆到新堆栈。

#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;

}

3 个答案:

答案 0 :(得分:1)

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));

答案 1 :(得分:0)

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

#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();
        ^^^^^
    }

等等。首先,您需要在使用下标运算符之前将新元素附加到向量。

答案 2 :(得分:0)

我想我知道你被绊倒了。

vector<int> tm(0);

创建一个包含0的向量。这会创建一个大小为0的向量。因为此列表的大小为0,所以您无法获得第一个元素。因为它是空的!

同样在这里:

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

这不会创建一个带有&#34; row&#34;的向量。它会创建一个空向量,因为你再次将大小设为0。

你可能想要这样的东西:

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

使用单个0创建一行tm,然后创建一个包含该行的2D向量ar

检查reference。您正尝试使用&#34; fill&#34;构造