当前位置: 首页 > news >正文

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

bug代码:

/*函数方法定义实现
*/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>>
]
  • _OutIt 是 merge 模板的输出迭代器类型。
  • 这里编译器把 _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 的前四个参数是输入范围的迭代器,第五个参数要求是 输出迭代器(指向存放结果的位置)。你传的 vt 是 vector<int> 对象,而不是迭代器,所以类型错了。


三、正确写法

应该传 输出迭代器,而不是容器本身。因为你已经 resize 了 vt,有足够空间,可以直接用 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) 自动插入。
http://www.dtcms.com/a/464989.html

相关文章:

  • 珠海网站专业制作wordpress 折线图
  • css、dom 性能优化方向
  • 【大前端】Android Deep Link 技术详解与实践指南
  • Linux操作系统如何使用ISO镜像文件来搭建本地镜像源?
  • UMI 中使用qiankun问题记录
  • 演示和解读ChatGPT App SDK,以后Android/iOS App不用开发了?
  • Spring Boot 与 WebSocket:长连接掉线、心跳与消息广播的问题
  • 数琨创享:新能源行业标杆企业QMS质量管理平台案例
  • 如何用easyui做网站网站设计说明书5000字
  • 从MySQL到ClickHouse超大规模数据分析的架构迁移实践与性能对比
  • 架构图在什么网站可以做wordpress-saas
  • echarts不根据传入参数,自定义 legend 的内容(视觉映射)
  • H3C IRF
  • 【C++】继承深度解析:继承方式和菱形虚拟继承的详解
  • 徐州 网站 备案 哪个公司做的好phpcms 中英文网站
  • WebSocket | 一点简单了解
  • 算法题基础 : Java : BufferedReader、BufferedWriter 和 StringTokenizer 详解
  • 企业微信 自建应用审批流程引擎功能开发【报错分析】
  • Slf4j 接口文档左侧菜单有显示,但是点击后空白
  • 【AES加密专题】4.Sbox的解析和生成
  • 考完HCIE数通,能转云计算 / 安全 / AI方向吗?
  • 重庆企业网站建设推荐怎么申请域名和备案
  • 松江 网站建设公司拼多多推广联盟
  • 中国极端气象干旱事件(1951-2022)
  • 一文详解Go 语言内存逃逸(Escape Analysis)
  • 学习threejs,实现粒子化交互文字
  • 密码学基础:RSA与AES算法的实现与对比
  • RAG:生成与检索的完美结合
  • 一款由网易出品的免费、低延迟、专业的远程控制软件,支持手机、平板、Mac 、PC、TV 与掌机等多设备远控电脑!
  • [C# starter-kit] Blazor EntityTable 组件 | 预构建