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

string vector

改成上图才能正确识别

改成上图才能正确识别

拷贝构造 现代写法

下图左传统 下图右现代

this 指向当前正在构造 / 操作的对象实例

成员变量也如左图一样

this 指向的对象,调用对应类的成员函数并传入参数

利用string tmp(s.str)会调用接收char*类型的构造函数(字符指针构造,不是默认构)得到tmp(帮我们完成原来我们手动需要完成的数据处理),

上图this是s2的。调用方s1,是传入函数的参数s

代码进行了交换,如果内置类型没有初始化是随机值,交换给tmp会有问题。因为tmp出了作用域后会析构,释放随机野指针 → 程序崩溃。所以这里将成员变量初始化。tmp销毁空指针

编译器在编译阶段,就计算好了这个类单个实例的总占用字节。在创建(使用构造函数)该类的对象之前,不管是栈、堆、全局区,都必须已经分配好完整的单个实例的总占用字节,这是对象的存储载体。

free,delete,delete[]空时直接返回,不会报错

赋值= 现代写法

调用接收char*类型的构造函数和拷贝构造都行

拷贝构造参数必须是引用。如果是传值传参(不是引用),那么会调用拷贝构造,拷贝构造又会调用传值传参,无穷递归。

赋值参数不用必须是引用,是传值传参,那么会调用拷贝构造,正好将s3拷贝构造给tmp,然后直接交换即可

s1原本的空间就需要释放,交还给tmp,tmp出了作用域后会自动调用析构函数

swap

自己手动模拟 库里模板

以交换两个自定义对象为例:

直接套库里模板会有三次深拷贝,伴随开空间拷贝数据析构等,代价太大。交换内置类型或无深拷贝对象就行

自己手动模拟的也是套库里模板,只不过交换的类型都是内置类型,效率明显提升

库里还有一个全局swap函数,与模板同名。所以出现swap情况下优先调用该函数。

一、标准库提供的全局std::swap(string& x, string& y)内部实现就是一行:

void swap(string& x, string& y) { x.swap(y); }
  1. 标准库内部已经给std::string写好了类内成员函数swap()
  2. 同时库中预实现了全局重载std::swap(string&, string&)
  3. 你直接写代码std::swap(s1, s2)就能调用,底层自动执行s1.swap(s2)
  4. x.swap(y)代表:用对象 x 调用自身的成员 swap 函数,传入对象 y

二、标准库里没有为你的自定义string类提前写好swap 重载

如果什么都不写,直接调用std::swap(s1,s2),会触发通用模板:

template<typename T> void swap(T& a, T& b) { T temp = a; // 完整拷贝整个字符串,复制堆上所有字符,低效 a = b; b = temp; }

性能极差,违背 swap 轻量化设计。

三、想要让std::swap(s1,s2)高效交换你的自定义 string,必须自己实现类内成员 swap

// 写在你的自定义string类里面 void swap(string& s) { std::swap(_str, s._str); std::swap(_size, s._size); std::swap(_capacity, s._capacity); }

只要有这个成员函数,调用std::swap(s1,s2)时,编译器依靠 ADL 查找规则,优先调用该函数,会自动执行s1.swap(s2),编译器优先去bit命名空间、string类内调用模拟实现的成员函数 swap,和标准文档描述行为一致,只交换三个内置变量,O (1) 开销

http://www.jsqmd.com/news/1265702/

相关文章:

  • AI智能体技术架构与核心模块深度解析
  • 基于Faster-RCNN的铁路隧道排水沟智能检测系统
  • 深入解析AM261x VIM中断控制器:架构、优先级与ECC保护实战
  • 10分钟解决Windows DLL缺失问题:VisualCppRedist AIO完整实践指南
  • 推荐国内电脑出租正规公司 - 品牌推广大师
  • [特殊字符] Codex 离线安装教程:绕过微软商店限制,手把手教你下载安装
  • 2026 年至今,古交热门的松木托盘出租厂商哪家强,别再花大价钱!这个木制托盘的秘密出租攻略-艳朝木托盘 - 企业推荐官【认证】
  • TRAE + Doubao-Seed-Evolving + Android Studio:如何跑通一个旧 App项目
  • UE5 Cesium数字孪生实战:自定义GlobePawn实现全球坐标系下的角色控制
  • 2026 年猇亭知名的漆水分离机供应商综合实力解析,揭秘:这台设备如何让你的漆面完美分离-益昇漆水分离机 - 行业甄选官
  • MongoDB 4.x——高级特性(Change Stream和事务)
  • 无人公司自动化运营:AI代理与编排技术解析
  • Windows 11缺失atl100.dll的完整解决方案与技术解析
  • 《数学三》考研模拟题及解析(六)
  • Linux防火墙与文件共享技术解析
  • 威海海风盐雾环境房屋漏水维修要点与2026本地服务商横向对比 - 雨婺虹房屋维修
  • C++单例设计模式详细讲解
  • Linux内存管理:malloc实现原理与性能优化
  • 民办高校实力如何分辨?权威维度看清优质院校底色,民办本科/民办大学,民办大学有哪些 - 品牌推荐师
  • 鸟枪换炮后的威力
  • 深入解析CC27xx LRFDPBE寄存器与HAL API:从原理到实践
  • 涂胶显影机(Track)技术岗【首席专家】面试打分卡
  • 高德地图与监控画面叠加的仿射变换实践
  • 02-PyTorch框架简介
  • 锂电池剩余寿命预测:DTW对齐与BiLSTM融合方案
  • OpenClaw:基于WSL的跨平台开发工具链配置指南
  • 2026 年现阶段,上海有实力的设备吊装实力厂家推荐几家,吊装效率翻倍的秘密,藏在这套操作流程里-淞琅起重设备 - 行业推荐【认证官】
  • C# 编程语言
  • LeRobot SO-101 机械臂从底层控制到 VLA 视觉语言动作模型完整实操复盘
  • 多模态大模型技术解析与工业应用实践