2017-06-08 275 views
-2

我試圖按照一個向量對具有兩個值的用戶定義數據類型的向量進行排序。但是我得到了bad_alloc的錯誤。這是代碼:程序中的C++向量std :: bad_alloc錯誤

#include<iostream> 
#include<vector> 
#include<algorithm> 

using namespace std; 

struct s{ 
int value; 
int weight; 
}; 

bool comp(s a , s b){ 
return a.value>b.value; 
} 

int main(){ 
vector <s> p; 
s temp; 
int n; 
cin>>n; 
while(n>=1){ 
    cin>>temp.value; 
    cin>>temp.weight; 
    p.push_back(temp); 
} 
sort(p.begin(), p.end(), comp); 
vector <s> :: iterator it; 
for(it = p.begin(); it != p.end();it++){ 
    *it = temp; 
    cout<<temp.value<<endl; 
} 

} 

運行:

扔 '的std :: bad_alloc的' 的一個實例是什麼()終止後,被稱爲:標準:: bad_alloc的

能有人幫忙嗎?

+2

'while(n> = 1)',一個無限循環? – songyuanyao

+1

'std :: vector :: push_back()'當緩衝區容量不足時重新分配內存。這和songyuanyao _must_提到的無限循環在經過足夠次數的迭代之後以'std :: bad_alloc'結束。我不明白的是:你如何提供如此多的輸入數據以致「內存不足」(又名bad_alloc)可能發生? – Scheff

回答

2

的問題,我看到:

無限循環

在循環

while (n >= 1) 
{ 
    ... 
} 

你不改變n的值。如果n大於循環開始時的1,循環將永不結束。

不檢查輸入

的狀態在

cin >> temp.value; 
cin >> temp.weight; 

您還沒有檢查這些調用是否成功。你假設他們已經做了並繼續使用temp

錯誤的方式分配

在最後的循環中,您使用的

*it = temp; 

將改變vector,不提取向量中的值。


這裏是main的更新版本,應該工作。

int main() 
{ 
    vector <s> p; 
    s temp; 
    int n; 
    cin>>n; 
    while(n>=1) 
    { 
     // If there is a problem reading, break. 
     if (!(cin>>temp.value)) 
     { 
     break; 
     } 

     // If there is a problem reading, break. 
     if (!(cin>>temp.weight)) 
     { 
     break; 
     } 

     p.push_back(temp); 

     // Decrement n 
     --n; 
    } 

    sort(p.begin(), p.end(), comp); 
    vector <s> :: iterator it; 
    for(it = p.begin(); it != p.end();it++) 
    { 
     // Extract the value from the vector and print it. 
     temp = *it; 
     cout<<temp.value<<endl; 
    } 
} 
1

如果用戶爲n輸入的值爲1或更高,則循環永不結束,填充矢量直到耗盡所有可用內存。你是不是在每次循環迭代遞減n如此循環,最終破壞:

while (n >= 1) { 
    cin >> temp.value; 
    cin >> temp.weight; 
    p.push_back(temp); 
    --n; // <-- add this 
} 

在這種情況下,一個for循環會比while循環更合適:

for (int i = 0; i < n; ++i) { 
    cin >> temp.value; 
    cin >> temp.weight; 
    p.push_back(temp); 
} 

我會去儘量通過爲struct s定義自定義operator>>,然後使用std::copy_n()std::istream_iteratorstd::back_inserter

#include <iostream> 
#include <algorithm> 
#include <iterator> 

istream& operator>>(istream &in, s &out) { 
    in >> out.value; 
    in >> out.weight; 
    return in; 
}  

int main() { 
    ... 
    int n; 
    cin >> n; 
    copy_n(istream_iterator<s>(cin), n, back_inserter(p)); 
    ... 
} 

您填寫的向量的任何方式,你comp功能應參照利用其輸入參數:

bool comp(s &a, s &b) { 
    return a.value > b.value; 
} 

而且,你的輸出循環沒有正確使用迭代。你需要擺脫*it =分配和剛剛輸出的參考價值的原樣:

for(it = p.begin(); it != p.end(); ++it) { 
    //*it = temp; // <- get rid of this 
    cout << it->value << endl; 
}