2012-02-20 82 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()))