2012-03-04 77 views
0

我坚持简单的矢量输入和输出操作。编译器返回错误说“的std :: outof范围”矢量<int>输入和输出

下面是代码

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); 
} 

我希望这个问题的内部工作的简要说明。

回答

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)将是该位置处的值。

5

您在trial.push_back(x)之前调用trial.at(i),访问尚不存在的元素。由于元素尚未存在,因此i是无效索引,at()在传递无效索引时将抛出std::out_of_range异常。如果没有发现异常,它将终止程序。据推测,您的平台的运行时库会显示导致程序终止的异常。

我想你真正想要的是这样的:

std::cout << "write at position " << i << '\t'; 
0
trial.at(i) 

你访问一个不存在的元素。

无论如何你可能需要cout<<"write at position"<< i <<'t';

+0

我只是试图写入矢量,我应该首先在位置[0]初始化它,然后使用cin来填充它? – 2012-03-04 15:54:33

+1

@AlterEgo为什么当你还没有插入它时,你试图读取矢量的第i个元素? – 2012-03-04 15:56:53

+0

@AlterEgo只是把'cin >> x; trial.push_back(x);'在访问元素之前。 – 2012-03-04 15:57:22

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()功能。

+0

很棒的回答。谢谢 – 2012-03-04 16:07:00