我在以下代码中遇到分段错误,任何人都可以解释。我认为它可能与初始化有关,但不确定。我只是尝试克隆现有的堆栈并执行操作,例如向克隆添加条目或从现有条目中删除条目并将其克隆到新堆栈。
#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;
}
答案 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);
但是在您提供的现有代码段中,没有关于第二维应该有多大的线索。
根据您在此回答中的评论,您对tm
和ar
的声明应为
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::cin
和std::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;构造