我遇到了简单的矢量输入和输出操作。编译器返回错误'std :: outof range'
这是代码
int main()
{
int size;
cout <<"Enter size of vector\n";
cin>>size;
cout<<"Now to input the vector of size "<<size<<endl;
vector <int> trial;
for (size_t i=0;i<size;++i){
int x;
cout<<"write at position"<<trial.at(i)<<'t';
cin>>x;
trial.push_back(x);
cout<<endl;
}
ostream_iterator<int> output(cout,"");
copy(trial.begin(),trial.end(),output);
}
我很感激对该问题内部运作的简要解释。
答案 0 :(得分:5)
您在trial.at(i)
之前调用trial.push_back(x)
,访问尚未存在的元素。由于该元素尚未存在,i
是无效索引,at()
在传递无效索引时会抛出std::out_of_range
异常。如果未捕获异常,它将终止该程序。据推测,您的平台的运行时库会显示导致程序终止的异常。
我想你真正想要的是这个:
std::cout << "write at position " << i << '\t';
答案 1 :(得分:2)
考虑这个循环的第一次迭代:
vector <int> trial;
for (size_t i=0;i<size;++i){
int x;
cout<<"write at position"<<trial.at(i)<<'t';
在第一次迭代中,没有任何内容被推入向量,因此trial.at(0)
尚未生效。结果将是一个例外。由于您在任何地方都没有try
/ catch
,这将终止您的程序执行。
在我看来,你想要cout << "write at position " << i;
。 i
是职位;在将其推入向量以使其有效后,vector.at(i)
将是该位置的值。
答案 2 :(得分:0)
trial.at(i)
您正在访问不存在的元素。
无论如何,你可能想要cout<<"write at position"<< i <<'t';
。
答案 3 :(得分:0)
问题在于这一行:
cout<<"write at position"<<trial.at(i)<<'t';
在设置向量大小之前调用此方法。我还不确定那条线路究竟要做什么。如果您正在尝试打印不会执行此操作的内存位置(地址),如果您正在尝试打印已经存在的位置,那么如果已经分配了它将会起作用。使用vector::push_back()
意味着您不需要预先分配。
您可以通过调整vector
的大小并直接访问元素来解决此问题:
trial.resize(size);
// loop
// vector.push_back(x) -- now becomes
vector[i] = x;
或者,您只需删除该位置的打印,然后像现在一样使用push_back()
。
由于您似乎正在调查如何使用vector
,我建议您尝试了解push_back()
和resize()
方法的不同之处,并了解一下vector::reserve()
函数。