向量的c ++代码中的运行时错误

时间:2018-06-19 04:30:54

标签: c++ vector

我正在尝试执行此代码,但每次在Ideone上都会出现运行时错误。这个错误的原因是什么?

this.child.'class_in_sidebar'

如何确定发生了哪个运行时错误?

2 个答案:

答案 0 :(得分:0)

您的运行时错误是因为您在初始化向量中的任何元素之前尝试访问v [i]。我建议你将元素q的数量传递给构造函数,以将q pair<pair<int,int>,int>元素的向量初始化为默认状态。

int p,q;
cin>> p >> q;
vector<pair<pair<int,int>,int>> v(q);
int i=0;
while(q--)
{
    cin>>v[i].first.first>>v[i].first.second>>v[i].second;
    i++;
}

我还建议查看Choice between vector::resize() and vector::reserve(),其中解释了另外两种初始化向量的方法 - (调整大小/保留)。

简而言之,resizing类似于上面代码中提到的构造函数,除了它可以在构造后随时调用以突然改变整个向量长度。

另一方面,保留实际上并不改变向量的长度,而是改变向量的基础容量(在向量必须改变其基础大小之前可以存储在向量中的最大元素数)。一旦向量被保留,push_back()是一个非常有用的函数,可以在不增加容量的情况下有效地将向量增加1(假设初始保留容量足够大)。

因此,对于上面的代码,您也可以这样写:

int p,q;
cin>> p >> q;
vector<pair<pair<int,int>,int>> v;
v.reserve(q) ///reserve large enough here, max capacity here is just q elements
int i=0;
pair<pair<int,int>,int> input;
while(q--)
{
    cin>>input.first.first>>input.first.second>>input.second;
    v.push_back(input);
    i++;
}

在上面的代码中,向量的基础容量将是q个元素,并且在while循环结束后,它也将具有q个元素的长度。下一个push_back()操作将是一项昂贵的操作。

答案 1 :(得分:0)

尝试将vector<pair<pair<int,int>,int>> v更改为vector<pair<pair<int,int>,int>> v(q) 避免运行时错误。

或者您也可以使用

vector<pair<pair<int,int>,int>> v; v.push_back({{1,2},3}); // v.push_back( make_pair (make_pair(1,2)) , 3 )

并将cout<<v[i].first.first<<v[i].first.second<<v[i].second更改为cout<<v[j].first.first<<v[j].first.second<<v[j].second以查看预期结果。

希望这有帮助!