我正在尝试执行此代码,但每次在Ideone上都会出现运行时错误。这个错误的原因是什么?
this.child.'class_in_sidebar'
如何确定发生了哪个运行时错误?
答案 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
以查看预期结果。
希望这有帮助!