Vector <int>输入和输出</int>

时间:2012-03-04 15:47:58

标签: c++ stl vector cin

我遇到了简单的矢量输入和输出操作。编译器返回错误'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);
}

我很感激对该问题内部运作的简要解释。

4 个答案:

答案 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()函数。