擦除矢量时出现分段错误
Posted
技术标签:
【中文标题】擦除矢量时出现分段错误【英文标题】:Segmentation fault while erasing vector 【发布时间】:2012-02-20 04:59:32 【问题描述】: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
【问题讨论】:
你试过在调试器下运行它吗? 所以当v1
不为空或v2
不为空时,您想从其中删除一些内容吗?如果那个是空的呢?
【参考方案1】:
使用 && 代替 ||:
while( !v1.empty() && !v2.empty())
当其中一个向量为空时,您不会进入 while 循环,然后尝试访问不存在的元素。
【讨论】:
【参考方案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];
【讨论】:
【参考方案3】:使用&&
:
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];
【讨论】:
【参考方案4】:以下条件:
if(v1[k] < v2[k])
此条件不检查 vector
是否已经为空。如果vector
s 之一被清空,那么您正在访问一个禁止的位置(v1[0]
或v2[0]
)。所以你的情况应该是这样的:
while(!(v1.empty() || v2.empty()))
【讨论】:
以上是关于擦除矢量时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章