2012-03-04 117 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