课程项目中合并后vector大小翻倍且含前导0的问题求助
听起来你在这个课程项目收尾阶段卡了个挺闹心的问题——合并后的vector大小翻倍还带着不该有的前导0,结合你负责实现的三个函数,我给你捋捋最可能的排查方向:
优先排查
multiway_merge函数(最可能出问题的环节) 你的问题描述完美匹配一种常见错误:初始化合并vector时误用了填充式创建,又混用了push_back添加元素。
- 比如如果你写了类似这样的代码:
结果必然是前导int total_elements = list_count * elements_per_list; vector<int> merged(total_elements, 0); // 这里直接创建了total_elements个0的vector // 然后归并循环里: merged.push_back(current_min_element);total_elements个0,再加上total_elements个实际合并的元素,最终大小刚好是预期的两倍! - 正确的做法二选一:
- 创建空vector,直接用
push_back添加元素(可以提前reserve(total_elements)提升效率):vector<int> merged; merged.reserve(total_elements); // 归并逻辑中: merged.push_back(current_min); - 先resize到目标大小,用索引填充而非
push_back:vector<int> merged(total_elements); int idx = 0; // 归并逻辑中: merged[idx++] = current_min;
- 创建空vector,直接用
再检查
quick_sort和partition函数 虽然排序函数主要负责单列表排序,但如果实现有误,也可能间接导致合并异常:
- 排查
partition:有没有在划分过程中错误地复制元素(比如用insert而非swap),导致原列表元素数量翻倍? - 排查
quick_sort递归逻辑:有没有传入错误的索引范围,导致同一个元素被重复处理并添加? - 可以在每个列表排序后打印其大小和元素,确认排序后的列表元素数量和输入时完全一致,没有多出来的0或重复元素。
额外小技巧
在关键步骤加打印调试:比如每个列表排序后打印状态,归并过程中每添加一个元素就打印当前merged的大小和元素,能快速定位问题出在哪个环节。
内容的提问来源于stack exchange,提问作者Jordan Ward
相关产品推荐
相关产品推荐

