2012-02-20 80 views
0
while(!v1.empty() || !v2.empty()) 
{ 
    int k=0;   
    if(v1[k] < v2[k]) 
     v1.erase(v1.begin()); 
    else 
     v2.erase(v2.begin()); 
    cout<<v1[0]; 
} 

這是我的代碼 在這裏,我想刪除的元素,直到其中一個是空的(向量排序), 一樣,如果分段故障而擦除矢量

V1包含2,3, 5,8

V2包含3,4,7

然後根據我應該給我8但它給人segmentation fault

+1

你試過一個調試器下運行呢? – reuben 2012-02-20 05:00:47

+0

所以雖然'v1'不是空的或者'v2'不是空的,你想從其中之一刪除一些東西?如果那個是空的呢? – 2012-02-20 05:05:36

回答

2
while(!v1.empty() && !v2.empty()) 
{ 
    int k=0;   
    if(v1[k] < v2[k]) 
     v1.erase(v1.begin()); 
    else 
     v2.erase(v2.begin()); 
} 
if (!v1.empty()) { 
    cout << v1[0]; 
} else if (!v2.empty()) { 
    cout << v2[0]; 
} 
5

使用& &,而不是||:

while(!v1.empty() && !v2.empty()) 

沒有你正在進入while循環,當載體之一是空的,隨後試圖訪問一個不存在的元素。

2

使用&&

while(!v1.empty() && !v2.empty()) 
{ 
    ... 
} 

第二個秋天是你erase後使用v1[0]。如果erase刪除矢量v1的最後一個元素,則v1[0]會導致未定義的行爲。

if(v1[0] < v2[0]) 
    v1.erase(v1.begin()); 
else 
    v2.erase(v2.begin()); 
cout << v1[0]; 
0

以下條件:

if(v1[k] < v2[k]) 

這種情況不檢查,如果vector已經是空的。如果其中一個vector s被清空,那麼您正在訪問一個禁止位置(v1[0]v2[0])。所以,你的情況應該是這樣的:

while(!(v1.empty() || v2.empty()))