如何不使用标准算法向已排序vector插入元素?代码异常原因排查
问题分析:已排序vector插入元素时的死循环异常
你遇到的问题核心是插入元素后触发了死循环,导致程序卡在insertfast函数里,根本没机会执行到main函数的输出代码。咱们一步步拆解代码的问题:
首先看你的insertfast函数里的循环条件:
while (v.size() != 9)
这个条件本身就很不合理——它依赖初始vector的大小固定为8,插入后要变成9,但一旦插入逻辑出错导致size偏离9,就会无限循环。
咱们模拟插入c1=4的过程:
- 初始vector是
{2,5,9,22,44,55,88,777},size=8,进入循环。 - 第一次循环计算
i=(1+8)/2=4,此时v[i-1]=22,显然22>4,两个insert条件都不满足,于是max=4。 - 第二次循环
i=(1+4)/2=2,v[i-1]=5>4,insert条件不满足,max=2。 - 第三次循环
i=(1+2)/2=1,此时v[i-1]=2 <=4 <=v[i]=5,触发第一个insert:把4插入到位置1,vector变成{2,4,5,9,22,44,55,88,777},size变成9。 - 重点来了:插入后你没有立即跳出循环,代码继续执行下一个if判断:
v[i] <=c && c <=v[i+1]。此时i=1,v[i]是刚插入的4,v[i+1]是5,4<=4<=5成立,于是又执行一次insert,把4插入到位置2,vector变成{2,4,4,5,9,22,44,55,88,777},size变成10。 - 现在循环条件
v.size()!=9永远为真(size是10),程序陷入死循环,再也走不到main函数的输出部分,所以你看不到任何输出。
再看插入大于9的数值(比如10)为什么正常:
- 当循环到i=2时,第一个insert条件
v[i-1]<=c<=v[i](5<=10<=9)不成立,但第二个条件v[i]<=c<=v[i+1](9<=10<=22)成立,执行一次insert后size变成9。 - 接下来代码继续执行到循环条件判断,此时size=9,循环终止,函数正常返回,main函数的输出代码得以执行。
除此之外,你的代码还有几个潜在问题:
- 循环条件硬编码
9,完全不通用——如果初始vector大小不是8,这个函数直接失效。 - 没有处理
i是最后一个元素的情况,比如当i等于v.size()-1时,v[i+1]会访问超出vector范围的内存,导致未定义行为。 - 插入元素后没有break,导致后续的条件判断可能重复插入元素,破坏vector的正确性。
内容的提问来源于stack exchange,提问作者koka
相关产品推荐
相关产品推荐

