用冒泡排序谈默认参数应用

 前面在调用函数提到为了将信息打印到ofil中,前面提到的办法是
ofstream ofil("text_out1");

void bubble_sort(vector<int>  vec){

}

在file scope中定义ofil,这是一个不受欢迎的举动。这样比较难在其他环境重用

一般的程序编写法则是,以“参数传递”作为函数间的沟通方式,比直接将对象定义于file scope更合适。

应该这样修改  void swap(int &val,int &val,ofstream  &ofil);

void bubble_sort(vector<int> &vec,ofstream &ofil);

例如

void swap(int &val1,int &val2,ofstream &ofil){
    ofil<<"swap("<<val1
    <<","<<val2<<")\n";
    
    int temp=val1;
    val1=val2;
    val2=temp;
    
    ofil<<"after swap(): val1 "<<val1
    <<"val2: "<<val2<<"\n";
}
 void bubble_sort(vector<int> &vec,ofstream &ofil)
 {
     for(int ix=0;ix<vec.size();++ix)
         for(int jx=ix+1;jx<vec.size();++jx)
             if(vec[ix]>vec[jx]){
             ofil<<"about to call swap"
                 <<"ix: "<<ix<<"jx: "<<jx<<"\t"
                 <<"swapping: "<<vec[ix]
                 <<"with"<<vec[jx]<<endl;
             swap(vec[ix],vec[jx],ofil);
             }
 }

#include <iostream>
#include <vector>
#include<fstream>  
using namespace std;void display(vector<int> vec,ostream &os=cout)
{for(int ix=0;ix<vec.size();++ix)os<<vec[ix]<<" ";os<<endl; } // void swap(int val1,int val2)
// {
// 	int temp=val1;
// 	val1=val2;
// 	val2=temp;
// }
//ofstream ofil("text_out1");
void swap(int &val1,int &val2,ofstream &ofil){ofil<<"swap("<<val1<<","<<val2<<")\n";int temp=val1;val1=val2;val2=temp;ofil<<"after swap(): val1 "<<val1<<"val2: "<<val2<<"\n";
}void bubble_sort(vector<int> &vec,ofstream &ofil){for(int ix=0;ix<vec.size();++ix)for(int jx=ix+1;jx<vec.size();++jx)if(vec[ix]>vec[jx]){ofil<<"about to call swap"<<"ix: "<<ix<<"jx: "<<jx<<"\t"<<"swapping: "<<vec[ix]<<"with"<<vec[jx]<<endl;swap(vec[ix],vec[jx],ofil);}}// void bubble_sort(vector<int> vec)
// {
// 	for(int ix=0;ix<vec.size();++ix)
// 		for(int jx=ix+1;jx<vec.size();++jx)
// 			if(vec[ix]>vec[jx])
// 				swap(vec[ix],vec[jx]);
// }int main(){int ia[8]={8,34,3,13,1,21,5,2};vector<int> vec(ia,ia+8);cout<<"vector before sort:";display(vec);ofstream ofil("dat.txt");bubble_sort(vec,ofil);cout<<"vector after sort:";display(vec,ofil);}

运行是可以成功的

 

但是存在两个问题

1.每次调用bubble_sort()都必须传入一个ofstream对象2而且用户无法关闭我们所产生的信息(我个人对第二个是这么理解的,每次都会在文件写)

如下所示,必须两个参数,一个就会报错

 然后我们思考,我们希望用户不但不必指定输出用的stream,而且有能力把输出信息关闭。默认情形下我们不想产生这些信息,但是我们又希望让那些想看到这些信息的用户可以产生他们,甚至指定其输出文件

我们考虑让部分参数设定默认值   代码如下

#include <iostream>
#include <vector>
#include<fstream>  
using namespace std;void display(vector<int> vec,ostream &os=cout)
{for(int ix=0;ix<vec.size();++ix)os<<vec[ix]<<" ";os<<endl; } // void swap(int val1,int val2)
// {
// 	int temp=val1;
// 	val1=val2;
// 	val2=temp;
// }
//ofstream ofil("text_out1");
void swap(int &val1,int &val2,ofstream *ofil=0){(*ofil)<<"swap("<<val1<<","<<val2<<")\n";int temp=val1;val1=val2;val2=temp;(*ofil)<<"after swap(): val1 "<<val1<<"val2: "<<val2<<"\n";
}void bubble_sort(vector<int> &vec,ofstream *ofil=0){for(int ix=0;ix<vec.size();++ix)for(int jx=ix+1;jx<vec.size();++jx)if(vec[ix]>vec[jx]){(*ofil)<<"about to call swap"<<"ix: "<<ix<<"jx: "<<jx<<"\t"<<"swapping: "<<vec[ix]<<"with"<<vec[jx]<<endl;swap(vec[ix],vec[jx],ofil);}}// void bubble_sort(vector<int> vec)
// {
// 	for(int ix=0;ix<vec.size();++ix)
// 		for(int jx=ix+1;jx<vec.size();++jx)
// 			if(vec[ix]>vec[jx])
// 				swap(vec[ix],vec[jx]);
// }int main(){int ia[8]={8,34,3,13,1,21,5,2};vector<int> vec(ia,ia+8);cout<<"vector before sort:";display(vec);ofstream ofil("dat.txt");bubble_sort(vec,&ofil);cout<<"vector after sort:";display(vec,ofil);}

将第二个参数声明为ofstream对象的一个pointer而非reference。我们必须做这样的改变,才可以为它设定默认值0,表示并未指向任何ofstream对象。reference不同于pointer,无法被设置为0。因此,reference一定要代表某个对象

然后有了这样的改变,当用户以单一参数调用bubble_sort()时,不会产生任何调试信息。如果调用时带有第二个参数,指向某个ofstream对象,那么这个函数便会产生调试信息。

 

int main(){int ia[8]={8,34,3,13,1,21,5,2};vector<int> vec(ia,ia+8);//以下就像调用bubble_sort(vec,0);一样//不会产生任何调试信息bubble_sort(vec);display(vec);//ok,这样会产生调试信息ofstream ofil("dat.txt");bubble_sort(vec,&ofil);display(vec,ofil);

修改display后输在文件上

void display(vector<int> vec,ostream &os=cout)
{
    for(int ix=0;ix<vec.size();++ix)
        os<<vec[ix]<<" ";
    os<<endl; 
 } 

效果如下 

这里做个小延申

1        默认值的解析操作由最右边开始进行。如果我们为某个参数提供了默认值,那么这一参数右侧的所有参数都必须也具有默认参数值才行。

2        默认值只能指定一次,可以在函数声明处,也可以在函数定义处,但切记不能在两个地方都指定。最好在函数声明处。头文件具有可见性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/412126.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web3.0基本概念简析

web3.0概念简析 web3.0的发展史 web1.0 仅用于展示&#xff0c;无法进行点赞评论等交互 web2.0 不仅可以展示&#xff0c;还可以上传视频、图片等&#xff0c;用户可以参与创作内容并获取收益。但还是中心化的模型 缺点 1 机械化的人机验证 2 账户安全无法保证 多年未登陆…

C++设计模式(李建忠)笔记3

C设计模式&#xff08;李建忠&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 参考链接 Youtube: C设计模式 Gtihub源码与PPT&#xff1a;https://github.com/ZachL1/Bilibili-plus 豆瓣: 设计模式–可复用面向对象软件的基础 文章目录 C设计模…

「alias」Linux 给命令起别名,自定义bash命令

0. 背景 Arch 系统没有 ll命令,在其他发行版用惯了一时间没有真不习惯,来配置一下吧! 1. 全局配置 我希望 ll 命令可以被所有人使用,所以应该配置在全局的bash配置文件中,一般这个全局bash配置文件在: /etc/bash.bashrc 切好管理员权限后,命令如下 echo “alias ll‘ls -l -…

低代码配置-属性配置面板设计

模块设计 tab项切换 组件基础属性组件数据属性组件事件属性表单属性 模块输出函数设计 tab切换函数 列表表单属性 数据来源&#xff1a; 调用接口时一次赋予&#xff0c;无需使用selectItem&#xff0c;如需使用&#xff0c;归入基础属性列表标题是否展示筛选区域 示例&am…

Docker安装开源Blog(Typecho)

前言 首先这个镜像是centos7.9进行安装PHP环境&#xff0c;然后挂载目录去运行的&#xff0c;镜像大概300MB左右&#xff0c;没学过PHP&#xff0c;没办法给Dockerfile文件 参考文章&#xff1a;Docker安装Typecho | D-y Blog感知不强&#xff0c;图一乐https://www.wlul.top…

Java多线程并发篇----第二十一篇

系列文章目录 文章目录 系列文章目录前言一、Java 中的阻塞队列二、ArrayBlockingQueue(公平、非公平)三、LinkedBlockingQueue(两个独立锁提高并发)四、PriorityBlockingQueue(compareTo 排序实现优先)前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默…

脚本编程游戏引擎会遇到哪些问题

在游戏开发中&#xff0c;脚本编程已经成为了一种非常常见的方式&#xff0c;用来实现游戏逻辑和功能。但是脚本编程游戏引擎也可能会面临一些挑战和问题。下面简单的探讨一下都会遇到哪些问题&#xff0c;并且该如果做。 性能问题 脚本语言通常需要运行时解释执行&#xff0…

Java-NIO篇章(2)——Buffer缓冲区详解

Buffer类简介 Buffer类是一个抽象类&#xff0c;对应于Java的主要数据类型&#xff0c;在NIO中有8种缓冲区类&#xff0c;分别如下&#xff1a; ByteBuffer、 CharBuffer、 DoubleBuffer、 FloatBuffer、 IntBuffer、 LongBuffer、 ShortBuffer、MappedByteBuffer。 本文以它的…

「优选算法刷题」:快乐数

一、题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&a…

汇聚户外露营产业链一手货源,来深圳户外展,高效对接厂商资源

漫步在静谧之地&#xff0c;与自然融为一体&#xff0c;户外露营逐渐走入人们视野&#xff0c;被越来越多的旅游爱好者所青睐。 2024年3月14-16日&#xff0c;中国&#xff08;深圳&#xff09;国际户外生活露营展览会&#xff08;COSP&#xff09;将在深圳会展中心(福田馆)盛…

Chondrex--Hydroxyproline Assay Kit羟脯氨酸检测试剂盒

胶原&#xff08;collagen&#xff09;既是结缔组织的主要成分&#xff0c;同时也是许多组织细胞外基质中主要的结构蛋白。作为哺乳动物体内含量最高、分布最广的功能性蛋白&#xff0c;胶原约占生物体内蛋白质总量的25&#xff05;至30&#xff05;&#xff0c;某些生物体甚至…

Nginx 简介

1、概念介绍 Nginx ("engine x") 是一个轻量级、高性能的 WEB 服务器软件和反向代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的&#xff0c;第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。其将源代码以类 BSD 许可证的形式发…