我的C++简单合并算法为何无法正常运行?
问题分析与修复方案
嘿,我来帮你找出问题所在!你的代码里有两个核心问题导致输出全是0,咱们一步步拆解:
1. vector初始化方式完全错了!
你用std::vector<int> vec1{5};这种写法,在C++里是列表初始化,意思是创建一个只包含单个元素「5」的vector,而不是大小为5的vector。之后你循环5次给vec1[i]赋值,从i=1开始就属于越界访问内存了——这是未定义行为,可能导致数据混乱、程序崩溃,或者像你遇到的输出全0的情况。
同样,vec3{10}也是创建了一个只有单个元素「10」的vector,但合并两个5元素的vector需要10个位置的空间,直接用vec3.begin()作为merge的目标迭代器,会越界写入内存,同样触发未定义行为。
2. merge的目标容器没准备好
std::merge不会自动帮你扩展目标容器的大小,要么你提前把目标容器的size设好,要么用std::back_inserter让它自动往容器里插元素。
修正后的完整代码
第一种方式:提前设置好容器大小
#include <iostream> #include <vector> #include <algorithm> int main() { // 用()初始化,创建大小为5的vector,元素默认初始化为0 std::vector<int> vec1(5); std::vector<int> vec2(5); // 创建大小为10的vector,用来装合并后的结果 std::vector<int> vec3(10); for(int i = 0; i < 5; i++){ vec1[i] = 2 * i; } for(int i = 0; i < 5 ; i++){ vec2[i] = 2 + 2 * i; } // 其实这里vec1和vec2已经是有序的,sort可以省略,保留也不影响 std::sort(vec1.begin(), vec1.end()); std::sort(vec2.begin(), vec2.end()); // 合并到vec3,此时vec3有足够空间 std::merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), vec3.begin()); for(auto itr = vec3.begin(); itr != vec3.end(); ++itr){ std::cout << " " << *itr; } return 0; }
第二种更灵活的方式:用back_inserter自动插入(不需要提前设置size)
#include <iostream> #include <vector> #include <algorithm> #include <iterator> // 要包含这个头文件才能用back_inserter int main() { std::vector<int> vec1(5); std::vector<int> vec2(5); std::vector<int> vec3; vec3.reserve(10); // 提前预留10个元素的空间,优化性能(可选) for(int i = 0; i < 5; i++){ vec1[i] = 2 * i; } for(int i = 0; i < 5 ; i++){ vec2[i] = 2 + 2 * i; } std::merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), std::back_inserter(vec3)); for(auto num : vec3){ std::cout << " " << num; } return 0; }
额外小提示
- 记住
vector<int> v(n)和vector<int> v{n}的区别:前者是创建n个默认值元素的vector,后者是创建包含单个元素n的vector。 - 调试的时候可以用
vec.at(i)代替vec[i],如果越界会直接抛出异常,帮你快速定位问题,而不是默默搞坏内存。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

