c++ bug 记录(merge函数调用时错误地传入了vector对象而非迭代器。)

bug代码:

cpp 复制代码
/*
	函数方法定义实现
*/

void test11() {
	vector<int> v1 = { 1,2,5,6 };
	vector<int> v2 = { 3,4,7,9 };
	vector<int> vt;//目标向量
	vt.resize(v1.size() + v2.size());
	merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vt);

	for_each(vt.begin(), vt.end(), print01);

}
void print01(int val) {
	cout << val << " ";
}

bug原因分析:

一、先看报错信息

plaintext

复制代码
错误 C2100 无法取消引用类型为"_OutIt"的操作数
错误 C2675 一元"++":"_OutIt"不定义该运算符或到预定义运算符可接收类型的转换
with
[
    _OutIt=std::vector<int,std::allocator<int>>
]
  • _OutItmerge 模板的输出迭代器类型。
  • 这里编译器把 _OutIt 推断成了 std::vector<int>(整个容器),而不是迭代器。
  • merge 内部会对输出迭代器做两件事:
    1. *result = value;(解引用赋值)
    2. ++result;(移动到下一个位置)
  • vector 本身是容器,不是迭代器,不能 *vector 也不能 ++vector,所以报错。

二、问题出在哪一行?

cpp

运行

复制代码
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vt);

merge 的前四个参数是输入范围的迭代器,第五个参数要求是 输出迭代器 (指向存放结果的位置)。你传的 vtvector<int> 对象,而不是迭代器,所以类型错了。


三、正确写法

应该传 输出迭代器 ,而不是容器本身。因为你已经 resizevt,有足够空间,可以直接用 vt.begin() 作为输出位置:

cpp

运行

复制代码
merge(v1.begin(), v1.end(),
      v2.begin(), v2.end(),
      vt.begin()); // ✅ 传迭代器

四、完整可运行代码

cpp

运行

复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void print01(int val) {
    cout << val << " ";
}

void test11() {
    vector<int> v1 = { 1,2,5,6 };
    vector<int> v2 = { 3,4,7,9 };

    vector<int> vt;
    vt.resize(v1.size() + v2.size()); // 提前分配空间

    // 正确写法:传输出迭代器 vt.begin()
    merge(v1.begin(), v1.end(),
          v2.begin(), v2.end(),
          vt.begin());

    for_each(vt.begin(), vt.end(), print01);
}

int main() {
    test11();
    return 0;
}

输出:

plaintext

复制代码
1 2 3 4 5 6 7 9

五、补充:如果你不想手动 resize

可以用 back_inserter(定义在 <iterator>)让 merge 自动 push_back

cpp

运行

复制代码
#include <iterator> // back_inserter 头文件

vector<int> vt; // 不用提前 resize
merge(v1.begin(), v1.end(),
      v2.begin(), v2.end(),
      back_inserter(vt)); // 自动插入到 vt 末尾

这样就不需要手动分配空间,更安全。


六、总结 bug 原因

  • 直接传了 vector 对象给 merge 的输出参数 ,而 merge 需要的是迭代器;
  • 容器不是迭代器,不能解引用和递增,导致编译报错;
  • 修复方法
    1. 如果容器已分配好空间,用 vt.begin()
    2. 如果容器未分配空间,用 back_inserter(vt) 自动插入。
相关推荐
毕设源码-朱学姐17 小时前
【开题答辩全过程】以 工厂能耗分析平台的设计与实现为例,包含答辩的问题和答案
java·vue.js
郭涤生17 小时前
布隆过滤器
c++
智者知已应修善业17 小时前
【求中位数】2024-1-23
c语言·c++·经验分享·笔记·算法
9ilk17 小时前
【C++】--- 特殊类设计
开发语言·c++·后端
Spring AI学习18 小时前
Spring AI深度解析(9/50):可观测性与监控体系实战
java·人工智能·spring
java1234_小锋19 小时前
Spring IoC的实现机制是什么?
java·后端·spring
xqqxqxxq20 小时前
背单词软件技术笔记(V2.0扩展版)
java·笔记·python
消失的旧时光-194320 小时前
深入理解 Java 线程池(二):ThreadPoolExecutor 执行流程 + 运行状态 + ctl 原理全解析
java·开发语言
哈哈老师啊20 小时前
Springboot学生综合测评系统hxtne(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·spring boot
4311媒体网20 小时前
帝国cms调用文章内容 二开基本操作
java·开发语言·php