自定义 swap 函数

2023-11-13

背景

STL 中提供了 swap 算法,用于交换两个对象的值,其一般实现方法如下:

namespace std{
    template<typename T>
    void swap( T&a,T&b )
{
        T temp(a);//拷贝构造
        a = b;//拷贝赋值
        b = temp;//拷贝赋值
    }
}

资源管理类

①.概述

通常包含资源(指针)的类需要提供自定义的拷贝构造函数及拷贝赋值运算符。

②.类定义

class demoClass
{
public:
    demoClass(const string& s = string()) :str(new string(s)) 
    { 
        cout << "构造函数执行" << endl; 
    }
    demoClass(const demoClass& d):str(new string(*d.str))
    {
        cout << "拷贝构造函数执行" << endl;
    }
    demoClass& operator=(const demoClass& d)
    {
        cout << "拷贝赋值函数执行" << endl;

        auto newStr = new string(*d.str);//拷贝底层资源
        delete str;//释放旧资源
        str = newStr;//赋新值
        return *this;
    }
    ~demoClass()
    { 
        cout << "析构函数执行" << endl;

        delete str;  
    }

private:
    string* str;//指针
};

③.默认 swap 操作

默认的 swap 算法会执行一次拷贝构造函数及两次拷贝赋值运算符,若对于比较大的资源会比较耗时。

int main()
{
    demoClass d1 = demoClass("123");
    demoClass d2 = demoClass("456");

    cout << "执行 swap " << endl;
    swap(d1, d2);

    system("pause");
    return 0;
}

在这里插入图片描述

④.自定义高效 swap

对应包含较大资源的类,交换时直接交换指针即可。把自定义的 swap 函数定义为类的友元函数以访问私有成员。

class demoClass
{
public:
    friend void swap(demoClass& d1, demoClass& d2) noexcept;//定义为友元
   /*
   同上
   */

private:
    string* str;//指针
};

void swap(demoClass& d1, demoClass& d2) noexcept
{
    using std::swap;
    swap(d1.str, d2.str);//交换指针
}

int main()
{
    demoClass d1 = demoClass("123");
    demoClass d2 = demoClass("456");

    cout << "执行 swap " << endl;
    swap(d1, d2);

    system("pause");
    return 0;
}

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义 swap 函数 的相关文章

  • 数据模板绑定垃圾邮件输出窗口出现错误:找不到管理 FrameworkElemen

    我有问题 System Windows Data 错误 2 找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement BindingExpression 无路径 数据项 空 目标元素是 So
  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • 在实体框架拦截器中向 DbScanExpression 添加内部联接

    我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 向每个查询添加过滤器 为了简单起见 我有两个表 一个称为 User 有两列 UserId 和 EmailAddress 另一个称为 TenantUser 有两列
  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • ASP.NET Web API 客户端 ProgressMessageHandler Post 任务卡在 WinForm 应用程序中

    我在用着HttpClient and ProgressMessageHandler来自MS ASP NET Web API 客户端库 http nuget org packages Microsoft AspNet WebApi Clien
  • 类特定的新删除运算符是否必须声明为静态

    标准中是否要求类特定的 new new delete 和 delete 是静态的 我可以让它们成为非静态成员运算符吗 为什么需要它们是静态的 它们被隐式声明为静态 即使您没有键入 static
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • 将标量添加到特征矩阵(向量)

    我刚刚开始使用 Eigen 库 无法理解如何向所有矩阵成员添加标量值 假设我有一个矩阵 Eigen Matrix3Xf mtx Eigen Matrix3Xf Ones 3 4 mtx mtx 1 main cxx 104 13 error
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • 在简单注入器中解析具有自定义参数的类

    我正在使用以下命令创建 WPF MVVM 应用程序简易注射器作为 DI 容器 现在 当我尝试从简单注入器解析视图时遇到一些问题 因为我需要在构造时将参数传递到构造函数中 而不是在将视图注册到容器时 因此这不是适用的 简单注入器将值传递到构造
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行

随机推荐

  • 混淆代码总结

    混淆代码网址很棒的网址 1 Android项目实战 二十五 Android studio 混淆 打包 验证是否成功 2 Android Studio 十一 代码混淆及打包apk 3 Android代码混淆之混淆规则 4 Error warn
  • Docker Desktop Windows 无法启动

    问题描述 windows下安装了Docker Desktop后 无法启动 连界面都不展示 尝试解决 windows组件 一开始以为是没装完整相关组件 把Hyper V组件全部都装上了 还是不行 docker服务 Google搜索相关问题 发
  • Android SurfaceFlinger3 申请Buffer

    本章节思维导图如上 主要讲述了 surafce 测试程序 demo 的第3步中的获取 Buffer 锁定 最关键 并写入 Buffer 的过程 一 概述 该部分代码是在上一章节中 Surface 测试程序源码的精简版 保存了最关键的流程 如
  • 同样的命令在终端执行OK,但是在shell脚本执行失败的原因

    同样的命令在终端执行OK 但是在shell脚本执行失败的原因 你刚用yum或者apt命令安装了一个程序 在终端执行完全OK 但是当你把他放在shell脚本中时候 执行这个shell脚本却报错了 提示找不到这个命令 hahaha 对于新手来说
  • 好好了解一下Cookie(强烈推荐)

    Cookie是由服务器端生成 发送给User Agent 浏览器会将Cookie的key value保存到某个目录下的文本文件内 下次请求同一网站时就发送该Cookie给服务器 对cookie知识感兴趣的朋友一起学习吧 Cookie的诞生
  • 小程序项目实战(七)

    此文章用于总结自己的知识点 有这个项目有兴趣的伙伴可以点击下方链接购买学习小程序音乐项目开发实战 大神coderwhy新课 学习视频教程 腾讯课堂课程简介正在上传 重新上传取消https ke qq com course 4162214ht
  • java+selenium

    selenium 前言 简介 1 安装驱动 2 简单案例走进爬虫 3 seleniumAPI 3 1创建一个可操控的浏览器对象 3 2打开指定页面 3 3定位元素 id定位 name定位 class 定位 link定位 xpath定位 3
  • 支付宝开发问题-“您当前注册的企业账号风险等级过高,根据国家相关法律法则及《支付宝服务协议》规定,我司无法为您提供支付服务”

    这属于支付宝开发最头痛的问题之一 这个问题导致号都开不出来 这个问题最主要的原因是 法人黑了 其他原因 不重要 1 申请前必须拥有经过实名认证的支付宝账户 2 企业或个体工商户可申请 纯个人不能申请 3 需要提供真实有效的营业执照 且支付宝
  • cordova打包命令汇总

    打包命令 1 生成未签名的apk 在项目根目录下 运行命令 cordova build release android 2 生成签名文件 进入platforms android build outputs apk release目录 如果有
  • 本地代码放到服务器上跑

    在学习过程中遇到的问题 在构建推荐系统的过程之中 进行相似度计算的过程之中 由于计算量比较大的原因 你本地跑代码的时间太长 这时候突然想到自己还有一台一直没用的服务器 因此我打算把自己的代码放到服务器上跑 一些定时脚本或者爬虫程序也必须放在
  • MySQL日志文件

    MySQL日志 MySQL 日志记录了 MySQL 数据库日常操作和错误信息 MySQL 有不同类型的日志文件 各自存储了不同类型的 日志 从日志当中可以查询到 MySQL 数据库的运行情况 用户的操作 错误的信息等 目录 MySQL四类日
  • idea开发配置-模板配置

    一 快速生成 1 创建Java类时 自动配置注释 作者 描述 时间等 进入设置页面 中文路径 编辑器 gt 文件和代码模板 gt Include gt File Header 英文路径 Editor gt File and Code Tem
  • vs+qt 给打包程序添加图标

    1 在创建的qt工程文件中添加如下代码 this gt setWindowIcon QIcon new prefix1 ico 设置软件图标 this gt setWindowTitle XXX软件名 设置软件标题 运行后软件的左上角会有图
  • Centos 7.5 安装superset

    一 物理方式安装 Centos 7 5 安装superset 1 环境依赖 首先 sudo dnf install gcc gcc c libffi devel python3 devel python3 pip python3 wheel
  • PHP定时访问api解决方案【已测试通过】

    背景介绍 今天打算做一个数据统计功能 由于数据结构复杂 无法通过存储过程来完成 所以只能开发PHP功能 定时调用该功能以完成数据统计 方案1 创建Windows计划任务 定时执行 bat批处理文件 具体实施方法 先创建一个 bat文件 例如
  • vue2 升级到 vue3 router 动态授权路由 异步加载报错 TypeError: Cannot read properties of undefined (reading ‘apply‘)

    使用 resolve gt require views item component resolve 会报错 TypeError Cannot read properties of undefined reading apply 我的解决历
  • 替换字符串中指定的字符串

    例如下面的例子 有时需要把某个字符串中的部分字符替换成另一个字符 可以使用std string 自带的函数replace replace第一个参数为起点 第二个为替换的长度 第三个为替换为的内容 for auto inventoryStat
  • 跟我学Spring Cloud(2020.0.0-M6版)-01-服务注册与服务发现-Eureka Server

    目录 1 所需要版本 2 创建基于web的Maven项目 SpringCloud 的服务注册中心 3 检查IntelliJ IDEA 的环境配置 4 检查java verison配置 5 检查Edit Configurations配置 6
  • 区块链技术基本概念

    链客 专为开发者而生 有问必答 此文章来自链客区块链技术问答社区 未经允许拒绝转载 区块链技术根本概念 了解这些名词是一个不错的开端 公钥加密系统 Alice有一把公钥和一把私钥 她可以用她的私钥创建数字签名 而Bob可以用她的公钥来验证这
  • 自定义 swap 函数

    背景 STL 中提供了 swap 算法 用于交换两个对象的值 其一般实现方法如下 namespace std template