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

这篇具有很好参考价值的文章主要介绍了用冒泡排序谈默认参数应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 前面在调用函数提到为了将信息打印到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);
 	
 }

运行是可以成功的

用冒泡排序谈默认参数应用,50,c++,算法,开发语言 

但是存在两个问题

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

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

用冒泡排序谈默认参数应用,50,c++,算法,开发语言 然后我们思考,我们希望用户不但不必指定输出用的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; 
 } 

效果如下 

用冒泡排序谈默认参数应用,50,c++,算法,开发语言

这里做个小延申

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

2        默认值只能指定一次,可以在函数声明处,也可以在函数定义处,但切记不能在两个地方都指定。最好在函数声明处。头文件具有可见性。文章来源地址https://www.toymoban.com/news/detail-800281.html

到了这里,关于用冒泡排序谈默认参数应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go 语言实现冒泡排序算法的简单示例

    以下是使用 Go 语言实现冒泡排序算法的简单示例: 在这个例子中, bubbleSort 函数接收一个整数切片,对切片中的元素进行冒泡排序。在 main 函数中,我们定义了一个示例数组,调用 bubbleSort 函数对其进行排序,并输出结果。 注意,冒泡排序算法的时间复杂度为 O(n^2),因此对

    2024年01月23日
    浏览(46)
  • 快速了解四种排序算法:希尔排序,堆排序,快速排序,冒泡排序(c语言)

     一个程序员一生中可能会邂逅各种各样的算法,但总有那么几种,是作为一个程序员一定会遇见且大概率需要掌握的算法。 1.1算法(algorithm ) 是指令的集合,是为解决特定问题而规定的一系列操作。 它是明确定义的可计算过程,以一个数据集合作为输入,并产生一个数据

    2024年02月16日
    浏览(50)
  • C语言入门:冒泡法排序、交换法排序和选择法排序算法的详解(代码分析)

     冒泡法排序 :顾名思义,小的数据就好像水中的气泡一样总是逐渐往上升, 大的数据就像石块一样往下沉,因此称为冒泡法排序法。 假如有n个数字,则需要进行n-1轮  第一轮结果:最大的数,被放在了最后一位  第二轮:元素 ‘8’ 已经拍好了顺序,所以只用将前4个元素

    2024年02月03日
    浏览(49)
  • C语言实现八大排序算法(详解插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序(递归和非递归)、归并排序(递归和非递归)和计数排序)

    本篇文章使用C语言实现了数据结构中常见的八大排序算法,它们分别是 插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序和计数排序 。在排序算法的实现过程中,每种算法都有其独特的特点和适用场景。插入排序通过逐步构建有序序列来排序,希尔

    2024年01月24日
    浏览(51)
  • 【数据结构与算法】排序算法:冒泡排序,冒泡排序优化,选择排序、选择排序优化

    目录 一、冒泡排序 1、冒泡排序思想 2、冒泡排序算法的性能分析 代码实现: 二、选择排序 1、选择排序思想 2、选择排序算法的性能分析  代码实现: 1、冒泡排序思想 冒泡排序的基本思想是通过相邻元素之间的比较和交换来逐步将最大(或最小)的元素移到右边(或左边

    2024年01月19日
    浏览(49)
  • C++常见排序算法——冒泡排序算法

    首先说一下冒泡排序的基本算法思想: 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸

    2023年04月08日
    浏览(39)
  • 排序算法:冒泡排序

    冒泡排序是入门级的算法,但也有一些有趣的玩法。通常来说,冒泡排序有三种写法: 一边比较一边向后两两交换,将最大值 / 最小值冒泡到最后一位; 经过优化的写法:使用一个变量记录当前轮次的比较是否发生过交换,如果没有发生交换表示已经有序,不再继续排序;

    2024年02月11日
    浏览(46)
  • 排序算法(1):冒泡排序

    (꒪ꇴ꒪ ),Hello我是 祐言QAQ 我的博客主页:C/C++语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍 快上🚘,一起学习,让我们成为一个强大的攻城狮! 送给自己和读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,请在评论区指

    2024年02月12日
    浏览(37)
  • 排序算法之冒泡排序(图解)

    冒泡排序 (英语: Bubble Sort )又称为 泡式排序 ,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是

    2023年04月19日
    浏览(50)
  • 常见排序算法之冒泡排序

    顾得泉: 个人主页 个人专栏: 《Linux操作系统》  《C/C++》  《LeedCode刷题》 键盘敲烂,年薪百万!         冒泡排序,英文名Bubble Sort,是一种相对基础的 交换排序 方法。这种排序算法的名字来源于它操作的过程,可以类比为数列中的每一个元素都可以像小气泡一样

    2024年02月05日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包