2012-02-20 24 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が、その後、私によると、それは私に8を与える必要がありますが、そのはを与える3,4,7

が含まれています代わりに||の3210

+1

あなたは、デバッガの下でそれを実行してみましたがありますか? – reuben

+0

'v1'は空ではありませんが、' v2'は空ではありません。あなたはそのうちの1つから何かを削除したいですか?もしそれが空であれば? –

答えて

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()) 

ベクトルのうちの1つが空で、その後がない要素にアクセスしようとしたとき、あなたはwhileループに入っています。

2

使用&&

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

第二の秋はあなたがerasev1[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のいずれかが空になると、禁止された場所(v1[0]またはv2[0]のいずれか)にアクセスしています。だからあなたの条件は次のようにする必要があります:

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