c++ 2D矢量SIGSEV错误
C++ 2D vector SIGSEV error
我在下面的代码中得到分割错误,有人可以费心解释一下吗?我认为它可能与初始化有关,但不确定。我只是试图克隆现有堆栈并执行操作,例如向克隆添加条目或从现有条目中删除条目并将其克隆到新堆栈。
#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);
但是在您提供的现有代码片段中,没有提示第二次元应该有多大。
根据你在这个回答中的评论,你的tm
和ar
的声明应该是
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::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();
^^^^^
}
等等。在使用下标操作符之前,首先需要向vector对象添加新元素。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- C :如何访问结构而不会获得SigSEV错误
- QSQLDATABASE:SIGSEV初始化错误
- c++ 2D矢量SIGSEV错误
- 为什么我得到一个SIGSEV错误,而试图使用一个过剩回调