【C语言】交换函数(swap)-CSDN博客
【C语言】交换函数(swap)
最新推荐文章于 2024-03-07 21:50:50 发布
话真多
最新推荐文章于 2024-03-07 21:50:50 发布
阅读量5.4w
收藏
193
点赞数
58
分类专栏:
C语言学习手册
文章标签:
c语言
原文链接:https://www.cnblogs.com/learnhow/p/8543822.html
版权
C语言学习手册
专栏收录该内容
7 篇文章
7 订阅
订阅专栏
这次我们要透过一个简单的函数swap深入理解函数传参的本质以及在C中如何选择传参方式。
首先,先来看第一段程序:
void swap(int x, int y) {
int temp = y;
y = x;
x = temp;
}
通过main函数的调用,我们发现x,y并未实现交换:
int main()
{
int x = 1;
int y = 37;
swap(x, y);
printf("x:%d; y:%d\n",x,y);
return 0;
}
【原因解析】:
整形x和y在函数swap内为按值传递,按值传递时,函数不会访问当前调用的实参。函数处理的值是它本地的拷贝,这些拷贝被存储在运行栈中,因此改变这些值不会影响实参的值。一旦函数结束了,函数的活动记录将从栈中弹出,这些局部值也就消失了。
在按值传递的情况下,实参的内容没有被改变。这意味着程序员在函数调用时无需保存和恢复实参的值。 如果没有按值传递机制,那么每个没有被声明为const 的参数就可能会随每次函数调用而被改变。按值传递的危害最小,需要用户做的工作也最少。毫无疑问,按值传递是参数传递合理的缺省机制。
另外,如果作为实参的变量是一个大型类的对象,分配并拷贝到栈中的时间和空间开销往往过大。 要实现swap函数的效果,我们应如何处理呢?
第一个可行的做法是将形参声明成指针:
void pswap(int *x, int *y) {
int temp = *y;
*y = *x; //将x指针所指地址的值 赋值给 y指针所指地址;*x相当于一个整数,将其赋值给指针变量所指的地址
*x = temp;
}
在pswap函数中,由于传递的是两个变量的内存地址(指针),使得我们可以直接操作对应的值。实际上这里还是存在按值传递的问题(其实并没对x y本身做了改变,x y仍指向原来的地址,只是地址中的值发生了变化),只是由原先的整形传递变成了指针传递。我们可以修改指针指向的内存却依然无法修改指针本身。
第二个可行的做法是将形参声明为指针的引用:
void prswap(int *&x, int *&y) {
int temp = *y;
*y = *x;
*x = temp;
}
void prswap(int *&x, int *&y) {
int *temp = y;
y = x;
x = temp;
}
请注意,同一个函数原型下我提供了两种函数定义。可无论哪一种,在实参传递的阶段都不会发生按值传递的问题。那么两种定义到底哪一种更满足我们需求: (1)交换内存中的值 (2)交换指针地址
如果单独考虑本文的需求,第一种方法更满足。但是,如果我们需要交换的是一个大型类对象,第二种的效率则更高。
总结:内存管理是C++学习的一个难点,初学者往往不容易掌握。但越是如此就越能体现一个开发者的语言内功。
转自:https://www.cnblogs.com/learnhow/p/8543822.html
优惠劵
话真多
关注
关注
58
点赞
踩
193
收藏
觉得还不错?
一键收藏
知道了
3
评论
【C语言】交换函数(swap)
这次我们要透过一个简单的函数swap深入理解函数传参的本质以及在C中如何选择传参方式。首先,先来看第一段程序:void swap(int x, int y) { int temp = y; y = x; x = temp;}通过main函数的调用,我们发现x,y并未实现交换:int main(){ int x = 1; int y = 37;...
复制链接
扫一扫
专栏目录
c语言swap(a,b)值交换的4种实现方法
09-05
c语言swap(a,b)值交换的4种实现方法,这么好的东西,尽管简单,但值得发表,以此共享。
C语言自学篇-swap交换函数的三种用法
m0_64962706的博客
03-07
2100
C语言自学整理
3 条评论
您还未登录,请先
登录
后发表或查看评论
【C语言】常用的字符换处理函数
qq_54634562的博客
12-14
370
strcpy函数的功能是将以sre为首地址的字符串复制到以dest为首地址的字符串,包括结束符'\0',返回dest地址。strncpy函数的功能是将以sre为首地址的字符串复制len个字符到以dest为首地址的字符数组,就是把。gets函数读入用户输入的字符串时,会读取换行符之前所有的字符(不包括换行符本身),并在字符串的。把两个字符数组中的字符串连接起来,把字符数组2中的字符串连接到字符数组1中的字符串的后面,,所以它的读取结束符就是 换行符,而scanf函数的读取结束符是 换行符和空格符,所以。
C/C++中关于交换(Swap)函数的三种方法
热门推荐
m0_74058637的博客
02-23
3万+
在学习编程中,交换函数是我们一定要理解的例子,以下是我的一些理解,希望可以帮助到大家。一、交换函数的说明在main函数中创建两个值,通过调用函数对其进行交换。分享一下我对这三种方法的理解,希望对大家有所帮助。
C语言--swap交换函数
m0_59052131的博客
11-17
1万+
对于Swap交换函数的四种情况的解以及代码+运行结果:
c语言中的Swap函数
weixin_51311212的博客
10-11
2万+
在学习C语言时,我们学到指针这里的时候,使用到Swap()函数,下面是关于Swap函数的一些见解。
首先我们通常会用下面的代码来实现Swap函数整型变量的交换:
void Swap(int *p1,int *p2)
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
下面这三种都是不能实现的常见的几种错误:
void Swap_err1(int a,int b)
{
int tmp = a;
a = b;
b = tmp;
}
void Swap_e
常见swap()函数实现和细节讲解
cuber-lotus的博客
08-22
1万+
前言说明
swap()函数的作用是进行交换传入的两个值。
本文都以整形int举例说明,且用C/C++描述
常见的swap的实现方式有三种
格外一个空间的临时存放发
无格外空间的位运算异或法
无额外空间的加减法
主程序框架
#include
void swap(int *a, int *b){
// return ;
}
int main (void)
{
int a = 3;
int b = 4;
swap(&a, &b
四种数组交换方法、指针及swap函数实现方法
weixin_44707979的博客
03-19
1万+
将数组A中的内容和数组B中的内容进行交换。
方法一:运用数组元素间进行逻辑运算来实现交换
#include <stdio.h>
#include <stdlib.h>
int main(){
int i,j,k;
int A[10];
int B[10];
printf("请输入数组A的内容:");
swap函数
stven_king的专栏
12-18
2236
swap的宏定义:
#include
#define swap(x,y)\
//在宏定义中的反斜杠表示的是这一行没有写完在下一行接着写
x=x+y;\
y=x-y;\
x=x-y;
int main()
{
int
x=1111,y=2222;
printf("\n%d\t%d",x,y);
swap(x,y);
printf("\n%d\t%d",x,y)
Swap(交换函数)
weixin_59179454的博客
11-21
2万+
交换两个变量的值
定义一个中间变量tmp,可实现交换
int main()
{
int a = 10;
int b = 20;
printf("%d,%d\n", a, b);
int tmp=a;
a=b;
b=tmp;
printf("%d,%d\n",a,b);
return 0;
}
现将用Swap函数来实现交换
错误形式1:
void Swap(int a, int b) //error c传值,形参的改变不会影响实参
{
int tmp
c语言------Swap函数
m0_73363985的博客
11-01
4752
Swap 函数
C语言指针应用简单实例
01-01
C语言指针应用简单实例
这次来说交换函数的实现:
1、
#include
#include
void swap(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
int main()
{
int a = 10, b = 20;
printf(交换前:\n a = %d, b = %d\n, a, b);
swap(a, b);
printf(交换后:\n a = %d, b = %d, a, b);
return
对两个整数通过函数调用交换其值,然后输出
12-02
对两个整数通过函数调用交换其值,然后输出。首先定义一个函数,3个值交换。在主函数函数声明(可省略),调用函数,输入要交换的两个值
swap交换函数
07-07
这是交换两个数的C++函数,通过引用传参成功在函数中实现交换两个参数
C++ 中的Swap函数写法汇总
12-20
在说C++模板的方法前,我们先想想C语言里面是怎么做交换的。 举个例子,要将两个int数值交换,是不是想到下面的代码: void swap(int&a , int &b) { int t = a; a=b; b=t; } 如果要求不用临时变量,可考虑异或的...
C++ Swap函数有几种写法?
01-20
在说C++模板的方法前,我们先想想C语言里面是怎么做交换的。 举个例子,要将两个int数值交换,是不是想到下面的代码: 如果要求不用临时变量,可考虑异或的方式。 整型数比较容易理解,如果是字符串呢?字符串交换...
SSD LDPC软错误探测方案解读
存储随笔
03-07
1353
因此,为了提高SSD的可靠性,亟需开发一种增强型解码方法,它可以更好地处理QLC闪存技术带来的高密度存储下的复杂错误分布,特别是针对长尾部分的严重错误比特,从而确保SSD在长期使用和恶劣环境下数据的完整性和安全性。这意味着系统能够利用数据的空间冗余,从其他没有明显错误迹象的页面中推断出受损页面的部分正确数据。在QLC NAND闪存技术中,尽管经验显示软解码区域的性能有所提升,但是错误比特分布的长尾问题愈发突出,意味着在极端情况下,即使是少量的错误比特也可能集中在某些数据块中,形成难以纠正的“尾巴”。
STM32单片机FPGA毕设电路原理论文报告mcs51单片机在汽车四轮转向系统中的应用
03-10
STM32单片机FPGA毕设电路原理论文报告mcs51单片机在汽车四轮转向系统中的应用本资源系百度网盘分享地址
pandasmore-0.0.6-py3-none-any.whl
最新发布
03-10
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
c语言交换函数
05-24
下面是一个使用 C 语言编写的交换函数:
```c
#include
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5;
int y = 10;
printf("Before swap: x = %d, y = %d\n", x, y);
swap(&x, &y);
printf("After swap: x = %d, y = %d\n", x, y);
return 0;
}
```
这个函数接受两个指向整数的指针作为参数,然后交换它们所指向的值。在主函数中,我们声明了两个整数变量 `x` 和 `y`,然后将它们作为参数传递给 `swap` 函数。注意,我们在调用 `swap` 函数时,使用了 `&` 运算符取得变量的地址,并将这些地址作为参数传递给函数。这样,在函数内部,我们就可以通过这些地址来访问变量,并交换它们的值。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
话真多
CSDN认证博客专家
CSDN认证企业博客
码龄6年
暂无认证
17
原创
10万+
周排名
75万+
总排名
8万+
访问
等级
646
积分
16
粉丝
130
获赞
8
评论
370
收藏
私信
关注
热门文章
【C语言】交换函数(swap)
54555
【vi】vi编辑器卡死解决方法
6967
【Qt】Qt中QMainWindow、QWidget、QDialog的区别
6427
【C语言】知识点总结(链表)
3513
单片机知识点整理
3044
分类专栏
LeetCode刷题笔记
7篇
单片机学习手册
1篇
C语言学习手册
7篇
Qt(C++)学习手册
1篇
Linux学习手册
2篇
其他
1篇
嵌入式硬件
1篇
最新评论
【C语言】交换函数(swap)
ID__10086:
为啥我会报错,第二种
【vi】vi编辑器卡死解决方法
Sunqk5665:
学习了,恍然大悟
【C语言】交换函数(swap)
路人于森:
swap(&x, &y);
【C语言】交换函数(swap)
TBS黑羊未签约飞手:
学到了学到了,and直接用别名也能改实参的值
【C语言】知识点总结(链表)
勿语人心:
那对于 LNode ** head,这种博主能讲讲吗,不太懂
最新文章
2021-5-30 连续子数组的最大和【简单题 剑指Offer 42】
2020-11-1 有效的括号【简单题20】
2020-10-31 最长公共前缀【简单题14】
2021年1篇
2020年10篇
2019年12篇
目录
目录
分类专栏
LeetCode刷题笔记
7篇
单片机学习手册
1篇
C语言学习手册
7篇
Qt(C++)学习手册
1篇
Linux学习手册
2篇
其他
1篇
嵌入式硬件
1篇
目录
评论 3
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
C/C++中关于交换(Swap)函数的三种方法_c++ swap-CSDN博客
C/C++中关于交换(Swap)函数的三种方法
好好学编程-.-
于 2023-02-23 01:26:25 发布
阅读量3.5w
收藏
232
点赞数
52
文章标签:
c++
c语言
算法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_74058637/article/details/129172674
版权
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
文章目录
前言
一、交换函数的说明
二、三种情况的说明
1.值传递
1.1值传递的运行结果
2.传址调用
运行结果:
3.引用作为函数参数
运行结果:
对于引用变量的说明
总结
前言
在学习编程中,交换函数是我们一定要理解的例子,以下是我的一些理解,希望可以帮助到大家。
一、交换函数的说明
在main函数中创建两个值,通过调用函数对其进行交换。
二、三种情况的说明
1.值传递
代码如下(示例):
#include
using namespace std;
//1.值传递
void Swap1(int x,int y)
{
int temp = x; //定义中间变量,用于交换两个数值的中间媒介
x = y;
y = temp;
}
int main()
{
int a = 20, b = 30;
Swap1(a,b); //调用交换函数1
cout << "a=" << a << endl;
cout << "b=" << b << endl;
system("pause");
return 0;
}
1.1值传递的运行结果
由此可见我们想要交换两个函数的数值,但是并没有实现交换,这是为什么呢?
由图可知,因为:传值函数并没有改变实参(a,b)的数值,只是改变了形参的数值(为了验证我们可以在函数中加入输出语句来验证形参是否改变)
可见形参被改变了。当函数调用结束后,x,y相应内存就会被清除。之后代码继续顺序执行,回到main函数执行输出语句。
2.传址调用
#include
using namespace std;
//2.地址传递
void Swap1(int *p1,int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
//cout << "x=" << *p1 << endl;
//cout << "y=" << *p2 << endl;
}
int main()
{
int a = 20, b = 30;
Swap1(&a,&b);
cout << "a=" << a << endl;
cout << "b=" << b << endl;
system("pause");
return 0;
}
运行结果:
由图可见,传址调用实现了两个数值的交换。Swap1(&a,&b),把地址传递过去,所以我们用指针进行接收void Swap1(int *p1,int *p2)。可以这样理解,指针p1指向a的那块内存,指针p2指向b的那块内存。*p1和*p2是对a和b的内存内数据进行操作,改变了实参的数值,所以在调用函数结束后a和b数值进行交换了。
3.引用作为函数参数
#include
using namespace std;
//3.引用作为函数参数
void Swap1(int &x,int &y)
{
int temp=x;
x = y;
y = temp;
}
int main()
{
int a = 20, b = 30;
Swap1(a,b);
cout << "a=" << a << endl;
cout << "b=" << b << endl;
system("pause");
return 0;
}
运行结果:
由图可见实现了两个数的交换,引用可以理解为给a起了一个”别名“同时可以操作一块地址a和x可以同时操作这块内存中的数据。所以在内存中的实参会被改变无论形参是否被释放。
对于引用变量的说明
#include
using namespace std;
//对于引用变量的解释
int main()
{
int a = 10;
//创建引用变量的语法:“ 数据类型 &别名=原名;”
int& b = a; //a和 b可以同时操作a这块内存的数值
int c = 20;
b = c;
cout <<"a=" << a << endl;
system("pause");
return 0;
}
总结
分享一下我对这三种方法的理解,希望对大家有所帮助。有不正确的或不准确的地方希望各位大佬留言指点一下,谢谢啦。
优惠劵
好好学编程-.-
关注
关注
52
点赞
踩
232
收藏
觉得还不错?
一键收藏
知道了
1
评论
C/C++中关于交换(Swap)函数的三种方法
在学习编程中,交换函数是我们一定要理解的例子,以下是我的一些理解,希望可以帮助到大家。一、交换函数的说明在main函数中创建两个值,通过调用函数对其进行交换。分享一下我对这三种方法的理解,希望对大家有所帮助。
复制链接
扫一扫
交换函数2_swap_c++交换函数_
10-03
能够实现参数的交换,swap函数利用变量的引用实现
第四届 蓝桥杯 竞赛试题题目 C/C++高职高专组
05-05
第四届“蓝桥杯”全国软件专业人才设计与创业大赛选拔赛
C/C++高职高专组
1、题目标题: 猜年龄
美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。
一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:
“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”
请你推算一下,他当时到底有多年轻。
通过浏览器,直接提交他那时的年龄数字。
注意:不要提交解答过程,或其它的说明文字。
2、标题: 马虎的算式
小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
有一次,老师出的题目是:36 x 495 = ?
他却给抄成了:396 x 45 = ?
但结果却很戏剧性,他的答案竟然是对的!!
因为 36 * 495 = 396 * 45 = 17820
类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54
假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?
请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
答案直接通过浏览器提交。
注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。
3、标题: 振兴中华
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg)
从 我 做 起 振
我 做 起 振 兴
做 起 振 兴 中
起 振 兴 中 华
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
答案是一个整数,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。
a=从
b=我
c=做
d=起
e=振
f=兴
g=中
h=华
4、标题: 幻方填空
幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。
欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。
他把1,2,3,...16 这16个数字填写在4 x 4的方格中。
如图p1.jpg所示,即:
16 ? ? 13
? ? 11 ?
9 ? ? *
? 15 ? 1
表中有些数字已经显露出来,还有些用?和*代替。
请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。
答案是一个整数,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。
5、题目标题:公约数公倍数
我们经常会用到求两个整数的最大公约数和最小公倍数的功能。
下面的程序给出了一种算法。
函数 myfunc 接受两个正整数a,b
经过运算后打印出 它们的最大公约数和最小公倍数。
此时,调用 myfunc(15,20)
将会输出:
3
60
// 交换数值
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void myfunc(int a, int b)
{
int m,n,r;
if(a
m=a;n=b;r=a%b;
while(r!=0)
{
a=b;b=r;
r=a%b;
}
printf("%d\n",b); // 最大公约数
printf("%d\n", ____________________________________); // 最小公倍数
}
请分析代码逻辑,并推测划线处的代码,通过网页提交。
注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!
6、标题:三部排序
一般的排序有许多经典算法,如快速排序、希尔排序等。
但实际应用时,经常会或多或少有一些特殊的要求。我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。
比如,对一个整型数组中的数字进行分类排序:
使得负数都靠左端,正数都靠右端,0在中部。注意问题的特点是:负数区域和正数区域内并不要求有序。可以利用这个特点通过1次线性扫描就结束战斗!!
以下的程序实现了该目标。
其中x指向待排序的整型数组,len是数组的长度。
void sort3p(int* x, int len)
{
int p = 0;
int left = 0;
int right = len-1;
while(p<=right){
if(x[p]<0){
int t = x[left];
x[left] = x[p];
x[p] = t;
left++;
p++;
}
else if(x[p]>0){
int t = x[right];
x[right] = x[p];
x[p] = t;
right--;
}
else{
__________________________; //填空位置
}
}
}
如果给定数组:
25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0
0 ,18,-2,0,16,-5,33,21,0,19,-16,25,-3,25
则排序后为:
-3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25
请分析代码逻辑,并推测划线处的代码,通过网页提交
注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!
7、标题:核桃的数量
小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:
1. 各组的核桃数量必须相同
2. 各组内必须能平分核桃(当然是不能打碎的)
3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛)
程序从标准输入读入:
a b c
a,b,c都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c<30)
程序输出:
一个正整数,表示每袋核桃的数量。
例如:
用户输入:
2 4 5
程序输出:
20
再例如:
用户输入:
3 1 1
程序输出:
3
资源约定:
峰值内存消耗(含虚拟机) < 64M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include
提交时,注意选择所期望的编译器类型。
8、题目标题:打印十字图
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)
$$$$$$$$$$$$$
$ $
$$$ $$$$$$$$$ $$$
$ $ $ $
$ $$$ $$$$$ $$$ $
$ $ $ $ $ $
$ $ $$$ $ $$$ $ $
$ $ $ $ $ $ $
$ $ $ $$$$$ $ $ $
$ $ $ $ $ $ $
$ $ $$$ $ $$$ $ $
$ $ $ $ $ $
$ $$$ $$$$$ $$$ $
$ $ $ $
$$$ $$$$$$$$$ $$$
$ $
$$$$$$$$$$$$$
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。
输入格式:
一个正整数 n (n<30) 表示要求打印图形的层数
输出:
对应包围层数的该标志。
例如:
用户输入:
1
程序应该输出:
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
再例如:
用户输入:
3
程序应该输出:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
请仔细观察样例,尤其要注意句点的数量和输出位置。
资源约定:
峰值内存消耗 < 64M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include
提交时,注意选择所期望的编译器类型。
9、标题:带分数
100 可以表示为带分数的形式:100 = 3 + 69258 / 714
还可以表示为:100 = 82 + 3546 / 197
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
题目要求:
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
例如:
用户输入:
100
程序输出:
11
再例如:
用户输入:
105
程序输出:
6
资源约定:
峰值内存消耗 < 64M
CPU消耗 < 3000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include
提交时,注意选择所期望的编译器类型。
10、标题:剪格子
如图p1.jpg所示,3 x 3 的格子中填写了一些整数。
我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60。
本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。
如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。
如果无法分割,则输出 0
程序输入输出格式要求:
程序先读入两个整数 m n 用空格分割 (m,n<10)
表示表格的宽度和高度
接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000
程序输出:在所有解中,包含左上角的分割区可能包含的最小的格子数目。
例如:
用户输入:
3 3
10 1 52
20 30 1
1 2 3
则程序输出:
3
再例如:
用户输入:
4 3
1 1 1 1
1 30 80 2
1 1 1 100
则程序输出:
10
(参见p2.jpg)
资源约定:
峰值内存消耗 < 64M
CPU消耗 < 5000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include
提交时,注意选择所期望的编译器类型。
1 条评论
您还未登录,请先
登录
后发表或查看评论
C++ 中的Swap函数写法汇总
12-20
swap函数几乎是所有初学者都写过的一个最基本的函数之一,通常是用它来了解函数概念、形参与实参、引用和指针。然而,这个极为基础的函数却有着非常重要的作用。正因为它的重要性、普遍性,意味着swap函数必须有着极高的安全性。本文给大家介绍C++ 常用编程–Swap函数有几种写法?
在说C++模板的方法前,我们先想想C语言里面是怎么做交换的。
举个例子,要将两个int数值交换,是不是想到下面的代码:
void swap(int&a , int &b)
{
int t = a;
a=b;
b=t;
}
如果要求不用临时变量,可考虑异或的方式。
void swap(int&a,int&b)
{
c语言中swap函数_C ++中的swap()函数
热门推荐
从零开始的教程世界
07-21
4万+
c语言中swap函数 介绍 (Introduction)
In this tutorial, we are going to learn the swap() function in C++ programming language. Swapping is a simple operation in C++ which basically is the exchange of data or v...
c语言swap(a,b)值交换的4种实现方法
01-20
这篇文章所要表述的内容的确很简单,写之前,我纠结了很久:写与不写。平常swap(a,b)值交换,我们基本都是使用第一种方法,对于数学较好的人,可能会想到第二种方法,想到时,一定感觉很好,。对于汇编或对位有理解的人,可能会想到第三种方法,这个方法很妙。但,真正促使我写这篇文章的,还是第四种方法,妙,真的很妙,先(b = a),我是真没想到,我想,这么好的东西,尽管简单,但值得发表,以此共享。
swap(a,b)值交换的四种方法: 代码如下:void swap(int &a, int &b) { //方法一: int tmp = 0; tmp = b;
swap交换函数
07-07
这是交换两个数的C++函数,通过引用传参成功在函数中实现交换两个参数
c语言中的Swap函数
weixin_51311212的博客
10-11
2万+
在学习C语言时,我们学到指针这里的时候,使用到Swap()函数,下面是关于Swap函数的一些见解。
首先我们通常会用下面的代码来实现Swap函数整型变量的交换:
void Swap(int *p1,int *p2)
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
下面这三种都是不能实现的常见的几种错误:
void Swap_err1(int a,int b)
{
int tmp = a;
a = b;
b = tmp;
}
void Swap_e
【C++】带你发掘swap函数的秘密
m0_48475532的博客
10-18
1万+
这篇文章主要介绍作者对C++中swap函数的一些新的认识。
C语言--swap交换函数
m0_59052131的博客
11-17
1万+
对于Swap交换函数的四种情况的解以及代码+运行结果:
常见swap()函数实现和细节讲解
cuber-lotus的博客
08-22
1万+
前言说明
swap()函数的作用是进行交换传入的两个值。
本文都以整形int举例说明,且用C/C++描述
常见的swap的实现方式有三种
格外一个空间的临时存放发
无格外空间的位运算异或法
无额外空间的加减法
主程序框架
#include
void swap(int *a, int *b){
// return ;
}
int main (void)
{
int a = 3;
int b = 4;
swap(&a, &b
C++中的swap(交换函数)
cxu123321的博客
04-19
5089
C++中的swap(交换函数)
交换两个变量的值很简单。
比如 int a = 1; b = 2; 交换a b的值
这个很简单 很容易想到的是找个中间变量比如 int temp = a; a = b; b = temp;
不需要中间变量可不可以?
当然是可以的。
比如
【加减法】
a = a + b;b = a - b;a = a - b;
该方法可以交换整型和浮点型数值...
C++ Swap函数有几种写法?
01-20
在说C++模板的方法前,我们先想想C语言里面是怎么做交换的。
举个例子,要将两个int数值交换,是不是想到下面的代码:
如果要求不用临时变量,可考虑异或的方式。
整型数比较容易理解,如果是字符串呢?字符串交换不能直接使用上面类似的方法赋值,想想原因是啥?
当然如果还可以用指针的指针。
上面的方法都是按特定的类型做的处理,有没更通用的写法?
我们来看看C++ 怎么处理交换:
是不是和int的很像?
我们再来看看标准库里面swap的算法是怎么实现的:
template 是c++里面很重要的概念,利用模板可以实现很多通用的算法。上面的std::swap要求T类实现拷贝构造函数,并且和上面
C/C++和Java达到swap不同功能
12-22
C/C++中swap功能的本质:通过传递变量地址(指针或引用)来交换变量地址中的值。 Java标榜当中对C/C++一个非常大的改进是:Java对程序猿屏蔽了变量地址的概念,降低指针误用。 在Java世界中函数
C++交换指针实例
12-31
本文实例讲述了C++交换指针的方法。分享给大家供大家参考。具体分析如下: 通常情况下,我们只是对普通数据进行交换,交换指针的问题很少涉及,这里总结下,也方便我们以后查阅。 首先看下整型两个数据的交换(这个...
C++基础学习之函数重载的简单介绍
01-21
前言 我们在平时写代码中会用到几个函数但是他们的实现功能相同,但是有些细节却不同。例如:交换两个数的值其中包括(int, float,char,...于是在C++中人们提出了用一个函数名定义多个函数,也就是所谓的函数重载。
标准c++中string类函数详解
12-27
标准c++中string类函数详解 片段: 这里是C++字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都 看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。 a) =,assign() //赋以新值 b) swap() /...
c++冒泡排序详解
12-26
说一说冒泡排序 冒泡排序,作为最基本的排序算法,由于原理像冒泡一样,所以取名为冒泡排序;...//待会会用到swap交换函数 using namespace std; int main() { int a[5]; //输入数据 for(int i=0;i<5>>a[i]
c++一维数组排序代码
最新发布
08-23
其中先引入变量,然后输入一维数组的数据,在第二个for循环中运用swap交换变量的函数求出,从第一个数据开始,如果前一个数据大于后一个数据,一交换变量,循环之后,就完成排序能够输出了。希望大家能够支持我,我...
C语言中传值与传指针的介绍与区别
01-20
我们可能听过C语言中的传值和传指针,在其他语言中,也有传引用一说,那么他们到底有什么区别呢?如果你还不能准确地分辨,就该好好了解一下了。 传值 我们在初学C语言的时候就被老师教过,下面的方式是无法交换a和...
swap
05-30
swap是一个常用的函数,用来交换两个变量的值。在C语言中,可以通过传递指针变量来实现swap函数。
例如,交换两个整数变量a和b的值,可以使用以下代码实现:
```
void swap(int *pa, int *pb) {
int temp = *pa;
*pa = *pb;
*pb = temp;
}
int main() {
int a = 10, b = 20;
printf("Before swap: a=%d, b=%d\n", a, b);
swap(&a, &b);
printf("After swap: a=%d, b=%d\n", a, b);
return 0;
}
```
输出结果为:
```
Before swap: a=10, b=20
After swap: a=20, b=10
```
在swap函数中,使用指针变量pa和pb分别指向传递进来的两个变量的地址,在函数体内部交换这两个变量的值。在main函数中,通过使用取地址运算符"&"来获取变量a和b的地址,并传递给swap函数,从而完成了变量值的交换。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
好好学编程-.-
CSDN认证博客专家
CSDN认证企业博客
码龄1年
暂无认证
7
原创
127万+
周排名
9万+
总排名
3万+
访问
等级
149
积分
27
粉丝
73
获赞
7
评论
240
收藏
私信
关注
热门文章
C/C++中关于交换(Swap)函数的三种方法
35757
E0461-非常量引用的初始值必须为左值
630
C++实现简易的string容器
403
C/C++中关于斐波那契数列(递归/非递归)的分享
365
C/C++中关于文件的读写操作部分
136
分类专栏
C++容器
1篇
最新评论
C++实现简易的string容器
CSDN-Ada助手:
恭喜你在博客中分享了C++实现简易的string容器的内容,这是一个很有趣的主题!希望你能继续保持创作的热情,不断分享更多有价值的内容。下一步,可以考虑深入探讨C++中其他常用容器的实现原理,这样可以让更多的读者受益。谢谢你的分享,期待你更多的精彩内容!
E0461-非常量引用的初始值必须为左值
CSDN-Ada助手:
恭喜您写了第6篇博客,题为“E0461-非常量引用的初始值必须为左值”。这是一个非常有深度和技术性的话题,我很欣赏您对这个问题的探索和总结。您的博客不仅解释了错误的含义,还提供了解决方案,对读者来说非常有帮助。
在下一步的创作中,我建议您继续探索其他与错误代码相关的话题,例如常见的编译错误、调试技巧或者优化建议等等。此外,也可以考虑分享一些实际案例,让读者更好地理解错误发生的原因和如何解决。
总之,您的博客已经展现出了很高的水平和专业性,我很期待您未来更多的创作。希望您能一如既往地保持谦虚态度,继续分享您的知识和经验。加油!
C/C++中关于文件的读写操作部分
CSDN-Ada助手:
这篇博文对于C/C++中文件的读写操作进行了简单而实用的介绍,非常有帮助!你的文章让我明白了为什么需要文件操作来保存运行数据,并且提示了一些基础操作的案例,十分实用。希望你能继续写下去,分享更多关于文件操作的知识。
除了文章中提到的基础操作,你还可以进一步探讨一些高级的文件操作技巧,比如文件的打开模式、文件指针的移动、二进制文件的读写等。另外,对于大文件的读写操作,你可以介绍一些优化的方法,比如使用缓冲区、分块读写等。这些扩展知识和技能会让读者更全面地了解文件操作的各个方面。期待你的下一篇博文!
如何写出更高质量的博客,请看该博主的分享:https://blog.csdn.net/lmy_520/article/details/128686434?utm_source=csdn_ai_ada_blog_reply2
C++/string类
CSDN-Ada助手:
非常恭喜你写了第5篇博客!标题为“C++/string类”的文章看起来非常有趣。你对C++中的string类进行了深入的探索,这无疑展示了你对该主题的扎实知识和研究能力。在未来的创作中,我建议你可以继续挖掘string类的更多应用场景,或者探讨与其他C++类的交互和优化方法。这样不仅可以进一步提升你的技术水平,也能为读者带来更丰富的知识体验。期待你在未来的博客中继续展现你的才华!
C/C++中关于斐波那契数列(递归/非递归)的分享
CSDN-Ada助手:
恭喜您写了第三篇博客!标题看起来非常有趣,我很期待阅读关于C/C++中斐波那契数列的分享。您的持续创作精神真令人钦佩!在下一步的创作中,或许您可以考虑探讨一些有关斐波那契数列在实际应用中的案例,以及如何优化算法的思路。谦虚地说,我相信您一定能够让读者们受益匪浅。期待您的下一篇博客!
CSDN 正在通过评论红包奖励优秀博客,请看红包流:https://bbs.csdn.net/?type=4&header=0&utm_source=csdn_ai_ada_blog_reply3
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
C++实现简易的string容器
E0461-非常量引用的初始值必须为左值
C++/string类
2023年7篇
目录
目录
分类专栏
C++容器
1篇
目录
评论 1
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
C/C++编程笔记:C++中的 swap 内置函数,用法详解_c++ std::swap-CSDN博客
C/C++编程笔记:C++中的 swap 内置函数,用法详解
最新推荐文章于 2024-03-09 23:33:27 发布
一起学编程
最新推荐文章于 2024-03-09 23:33:27 发布
阅读量2.6w
收藏
21
点赞数
17
分类专栏:
C++
文章标签:
stl
c++
swap
内置函数
编程
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42366672/article/details/114700251
版权
C++
专栏收录该内容
246 篇文章
40 订阅
订阅专栏
函数std :: swap()是C ++标准模板库(STL)中的内置函数,该函数交换两个变量的值。
句法:
swap(a,b)
参数:该函数接受两个必须交换的必需参数a和b。参数可以是任何数据类型。
返回值:该函数不返回任何内容,它交换两个变量的值。
下面的程序说明了swap()函数:
示例一:
#include
using namespace std;
int main()
{
int a = 10;
int b = 20;
cout << "Value of a before: "<< a << endl;
cout << "Value of b before: "<< b << endl;
// swap values of the variables
swap(a, b);
cout << "Value of a now: "<< a << endl;
cout << "Value of b now: "<< b << endl;
return 0;
}
输出:
Value of a before: 10
Value of b before: 20
Value of a now: 20
Value of b now: 10
示例二:
#include
using namespace std;
int main()
{
string a = "ABCD";
string b = "function";
cout << "Value of a before: "<< a << endl;
cout << "Value of b before: "<< b << endl;
swap(a, b);
cout << "Value of a now: "<< a << endl;
cout << "Value of b now: "<< b << endl;
return 0;
}
输出:
Value of a before: ABCD
Value of b before: function
Value of a now: function
Value of b now: ABCD
每天学点小知识,希望对你有帮助~
另外如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!笔者这里或许可以帮到你~
C语言C++编程学习交流圈子【点击进入】微信公众号:C语言编程学习基地
分享(源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
优惠劵
一起学编程
关注
关注
17
点赞
踩
21
收藏
觉得还不错?
一键收藏
知道了
2
评论
C/C++编程笔记:C++中的 swap 内置函数,用法详解
函数std :: swap()是C ++标准模板库(STL)中的内置函数,该函数交换两个变量的值。句法:swap(a,b)参数:该函数接受两个必须交换的必需参数a和b。参数可以是任何数据类型。返回值:该函数不返回任何内容,它交换两个变量的值。下面的程序说明了swap()函数:示例一:#include <bits/stdc++.h>using namespace std;int main(){ int a = 10; int b = 2
复制链接
扫一扫
专栏目录
C++ Swap函数有几种写法?
01-20
在说C++模板的方法前,我们先想想C语言里面是怎么做交换的。
举个例子,要将两个int数值交换,是不是想到下面的代码:
如果要求不用临时变量,可考虑异或的方式。
整型数比较容易理解,如果是字符串呢?字符串交换不能直接使用上面类似的方法赋值,想想原因是啥?
当然如果还可以用指针的指针。
上面的方法都是按特定的类型做的处理,有没更通用的写法?
我们来看看C++ 怎么处理交换:
是不是和int的很像?
我们再来看看标准库里面swap的算法是怎么实现的:
template 是c++里面很重要的概念,利用模板可以实现很多通用的算法。上面的std::swap要求T类实现拷贝构造函数,并且和上面
C++ swap介绍及使用
10-09
1、本文详细描述了C++语言swap函数的使用方法。
2、通过详细示例,让读者更直观地阅读,更清晰的理解。
3、示例代码可直接复制,编译后可直接运行。
4、根据示例以及运行结果,让读者加强记忆及理解。
2 条评论
您还未登录,请先
登录
后发表或查看评论
C++函数对象-函数包装器-(std::function)(三)交换内容(std::function<R(Args...)>::swap)
qq_40788199的博客
01-17
372
交换 *this 与 other 存储的可调用对象。
为 std::function 特化 std::swap 算法。交换 lhs 与 rhs 的状态。等效地调用 lhs.swap(rhs) 。
交换函数2_swap_c++交换函数_
10-03
能够实现参数的交换,swap函数利用变量的引用实现
c++中std::swap使用方法
四叶草姚的博客
07-30
3万+
c++中std::swap使用方法
1.std::swap的源码:
template<typename _Tp>
inline void
swap(_Tp& __a, _Tp& __b)
#if __cplusplus >= 201103L
noexcept(__and_<is_nothrow_move_constructible...
【C++数据结构】最基本的算法:交换(swap)
男性成年程序员
04-01
920
目录
思路:
常见误区(错误示范)
C/C++的swap实现方法(传指针)
C/C++的swap实现方法(宏定义)
C++的swap实现方法(引用)
C++的swap实现方法(模板函数)
总结
思路:
交换算法可以类比于一杯咖啡a和一杯白开水b进行交换,交换a, b的值,需要一个中间变量temp,作为a,b交换的媒介。temp=a,a=b,b=temp实现交换
// 最简单,...
c++ std::swap() 函数
qq_30694087的博客
08-22
2万+
c++ std::swap() 函数
最近刚开始学习c++容器,发现容器中提供的swap()函数并不是交换了两个容器的内容,而是交换了两个容器的地址。比如如下代码:
#include
#include
using namespace std;
template
os &l
C/C++中关于交换(Swap)函数的三种方法
热门推荐
m0_74058637的博客
02-23
3万+
在学习编程中,交换函数是我们一定要理解的例子,以下是我的一些理解,希望可以帮助到大家。一、交换函数的说明在main函数中创建两个值,通过调用函数对其进行交换。分享一下我对这三种方法的理解,希望对大家有所帮助。
c++——std::swap的实现
www_dong的博客
11-04
2738
std::swap的源码实现如下:
template
void swap(T &a,T &b) noexcept
{
T temp = std::move(a);
a = std::move(b);
b = std::move(temp);
}
std::swap是基于std::move语义实现的,关于std::move的介绍可以参考:c++11总结03——右值引用_www_dong的博客-CSDN博客
...
c语言中swap函数的参数,std :: swap()函数以及C ++ STL中的示例
weixin_39714565的博客
05-18
1682
std :: swap()swap()是一个标准的库函数,它可以将任意两个对象交换b / w值。在C11中,它已移至标头下。以下是swap()的语法详细信息。语法:voidswap(T&a,T&b);参数: T&a,T&b,它们是要交换的对象返回类型: void-不返回任何内容。用法:交换两个对象的黑白值例子:1)交换两种内置数据类型在下面的示例中,我们看到如何使用std...
C++中的swap(交换函数)
cxu123321的博客
04-19
5089
C++中的swap(交换函数)
交换两个变量的值很简单。
比如 int a = 1; b = 2; 交换a b的值
这个很简单 很容易想到的是找个中间变量比如 int temp = a; a = b; b = temp;
不需要中间变量可不可以?
当然是可以的。
比如
【加减法】
a = a + b;b = a - b;a = a - b;
该方法可以交换整型和浮点型数值...
c++ 编程练习 002:难一点的swap
01-07
描述
填空,使得程序输出结果是:
5,3
#include
using namespace std;
void swap(
)
{
int * tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 3,b = 5;
int * pa = & a;
int * pb = & b;
swap(pa,pb);
cout << *pa << , << * pb;
return 0;
}
输入
无
输出
5,3
样例输入
无
样例输出
5,3
来源
Guo Wei
分析
此处如果单纯的只传入void swap(int *a,int *
C++ 中的Swap函数写法汇总
08-24
主要介绍了C++ 中的Swap函数写法汇总,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
swapBuffers.rar_驱动编程_C/C++_
08-12
Swap buffers sample. For hiding files filters
详解C++中的内联函数和函数重载
01-01
C++提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(inline function),又称内嵌函数或内嵌函数。 指定内联函数的方法很...
C++高级面试题:解释 C++ 中的 RTTI(Run-Time Type Information)。
qiuyehuanghun的博客
03-07
578
然后尝试将 ptr1 转换为 Derived2* 类型,转换失败,因为 ptr1 指向的不是 Derived2 类型的对象。如果转换失败,dynamic_cast 返回空指针(对指针进行转换)或引发 std::bad_cast 异常(对引用进行转换)。typeid 运算符接受一个表达式作为参数,并返回一个 std::type_info 对象,该对象包含有关表达式的类型信息。C++ 中的 RTTI(Run-Time Type Information)是一种机制,用于在运行时获取对象的实际类型信息。
C语言break 语句的基本作⽤是什么?
努力探索而不中用的飞飞
03-07
530
break 语句⽤于在程序中跳转,那么它具体是怎样跳转的呢?continue 语句也⽤于跳转,它们有什么区别呢?
【C++】每日一题 3 无重复字符最长子串
ZSZ_shsf的博客
03-07
436
在上面的代码中,我们维护了一个滑动窗口,通过start和end指针来表示窗口的开始和结束位置。当遇到重复字符时,我们将窗口的起始位置更新为重复字符的下一个位置,并计算当前最大子串长度。最终返回最大子串的长度。这一行代码时,如果currentChar在charIndex中不存在,会创建一个新的key-value对并赋值。注意使用unordered_map时把字符和该字符的索引作为键值对,这样可以节省一次查找重复字符索引的循环。给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
C++——string模拟实现
最新发布
2303_78442132的博客
03-09
1211
C++、string类
c++ std::swap
08-31
std::swap 是 C++ 标准库中的一个函数模板,用于交换两个变量的值。它的定义位于
std::swap 有多个重载版本,可以用于不同类型的变量交换操作。基本用法如下:
```cpp
#include
int main() {
int a = 10;
int b = 20;
std::swap(a, b);
// 现在 a 的值为 20,b 的值为 10
return 0;
}
```
在这个例子中,我们使用 std::swap 来交换变量 a 和 b 的值。
需要注意的是,std::swap 是一个模板函数,它可以接受任意类型的参数。对于自定义类型,需要提供相应的交换操作,或者重载 std::swap 函数来适配该类型。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
一起学编程
CSDN认证博客专家
CSDN认证企业博客
码龄6年
暂无认证
1133
原创
1万+
周排名
60万+
总排名
204万+
访问
等级
2万+
积分
1万+
粉丝
3097
获赞
922
评论
1万+
收藏
私信
关注
热门文章
程序员的 10 款代码表白特效,一个比一个浪漫
71372
盘点:计算机专业含金量最高的证书!只需一种证书在手,从此不愁
60512
【520表白】C语言开发《浪漫流星雨》表白程序,源码来了!
41335
C/C++编程笔记:如何将字符串转换为数字,数字转换为字符串?
36010
【数据结构和算法】学编程必知必会的50个代码实现,你都会了吗?
26783
分类专栏
C语言
360篇
C++
246篇
经验分享
96篇
编程语言
47篇
算法
17篇
程序员
460篇
求职面试.
33篇
互联网
40篇
数据结构
43篇
电脑知识
35篇
最新评论
C/C++项目开发:《火柴人游戏》,500行源代码开发
扑楞蛾子:
咋领取啊 在哪儿领取啊
C语言实现《贪吃蛇》小游戏,代码分享+思路注释
i各方反应:
写的好的
C/C++项目实战:2D射击游戏开发(简易版), 440 行源码分享来啦~
A18975992052:
服了,头文件报错
C语言零基础项目:迷宫游戏!详细思路+源码分享
期末不挂科。:
为什么一堆报错?
C语言实现贪吃蛇小游戏!(超简单详细)详细思路+源码分享
Fzzs:
没有自定义头文件snake.h
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
【项目实战】C语言+easyX带你实现:数字拼图游戏!来试试吧~
【项目实战】C语言+easyX带你实现:找方块
【项目实战】C/C++语言带你实现:围棋游戏丨详细逻辑+核心源码
2023年25篇
2022年224篇
2021年570篇
2020年493篇
2019年14篇
目录
目录
分类专栏
C语言
360篇
C++
246篇
经验分享
96篇
编程语言
47篇
算法
17篇
程序员
460篇
求职面试.
33篇
互联网
40篇
数据结构
43篇
电脑知识
35篇
目录
评论 2
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
Effective C++读书笔记(25): swap的高效实现 - 知乎首发于Effective C++ 读书笔记切换模式写文章登录/注册Effective C++读书笔记(25): swap的高效实现矮凳资深铲屎官/暂时退乎守则25: 要优化不抛出异常的swap函数"Consider support for a non-throwing swap."本篇关键词: swap函数,pimpl,特殊化,重载,名空间swap函数是一个非常经典又有用的函数,除了它本身用来交换两个对象数值的功能,还可以用来实现异常安全的赋值,避免自赋值(见第11章)等等用途。在std标准库里,swap函数就是这样实现的,和你想的一模一样:namespace std{
template
void swap(T& a, T& b){
T temp(a);
a = b;
b = temp;
}
}如果要用在自己定义的类型上,只要能支持拷贝,即拷贝构造函数或者拷贝赋值运算符,功能上std::swap完全能实现你想要的。但你可能也注意到了,这个实现会生成许多拷贝,把a拷贝进temp,把b拷贝进a,最后把temp拷贝进b,一共有三份拷贝。假如要调换两个包含10万个元素的std::vector,这么做要消耗的内存实在是太大了。要解决这样的问题,有一个常用的方法叫pimpl(the "pimpl" idiom,即"pointer to implementation")。它的概念就是要把类的实现细节从中移除,放在另一个类中,并通过一个指针进行访问。使用pimpl设计手法的类大概长这样: //这个类包含Widget类的数据
class WidgetImpl{
public:
...
private:
int a,b,c;
std::vector
};
//使用pimpl手法的类
class Widget{
public:
Widget(const Widget& rhs);
//赋值运算符的实现见10,11,12章
Widget& operator=(const Widget& rhs){
...
*pImpl = *(rhs.pImpl);
...
}
...
private:
WidgetImpl* pImpl; //使用pimpl指针来指向我们的数据
};这样一来,要调换两个对象,直接交换指针就行了,不用再对成千上万的数据进行交换。可是默认的std::swap并不知道这些,而且直接使用std::swap的话,除了生成3份Widget对象本身的拷贝,还有3份它包含的WidgetImpl对象的拷贝。这要怎么办呢? 既然它自己不知道,那就让我们告诉std::swap,当传进来Widget对象时,要特别对待,这就是今天要讲的特殊化(specialization):namespace std{
//特殊化的std::swap,当T是Widget类型时使用如下实现
template<>
void swap
swap(a.pImpl,b.pImpl); //这里的参数是指针,不会用到该特殊化,所以不用担心无限递归
}
}"template<>"代表了下面的代码是对std::swap的完全特殊化(total specialization)实现,函数名字后面的"
public:
...
void swap(Widget& data){
using std::swap; //这句稍后解释
swap(pImpl, other.pImpl); //执行真正的swap,只交换指针
}
...
};
namespace std{
template<> //完全特殊化的std::swap
void swap
a.swap(b);
}
}这样就可以编译了,而且这也是STL标准容器实现swap的方法,STL容器也使用了公有的swap成员函数和一个特殊化的std::swap来调用这个成员函数实现高效交换功能。以上我们讨论过了类,那么对于类模板又要怎么做呢?template
class WidgetImpl{...};
template
class Widget{...};如果我们还按照上面一样的方法,当然十分简单,但这样的特殊化是过不了编译的:namespace std{
template
void swap
a.swap(b);
}
}这种做法叫部分特殊化(partial specialization),即"template<...>"参数表里面还有一个模板参数而不是完全特殊化的"template<>"。C++允许对类模板进行部分特殊化,但不允许对函数模板进行部分特殊化,因此这个方法是行不通的。那我们怎么办呢? 理论上我们可以写一个std::swap模板的重载:namespace std{
//定义一个重载函数模板
template
void swap(Widget
a.swap(b);
}
}但这种方法并不太推荐,只能叫一个hack,因为std是一个特殊的名空间,我们可以对其中的功能进行特殊化,但不允许往里面再塞东西,因为只有C++委员会才可以对std的内容进行修改。当然理论上即使你加了东西程序也可以编译,但可能会导致我们看不到的冲突,就会导致程序崩溃。那么现在这么办呢? 其实也很简单,我们依然使用相同的方法定义一个非成员swap函数调用成员swap函数,但不要放在std名空间里,而是放在和我们类模板相同的名空间里://我们自己的名空间
namespace WidgetStuff{
//我们的类模板
template
class Widget{...};
...
//swap函数和类模板在同一名空间
template
void swap(Widget
a.swap(b);
}
...
}这样做还有一个好处就是能把和我们自定义的类相关的所有功能全部整合在一起,在逻辑上和代码上都更加整洁。而且这也符合C++的函数搜索规则,会自动在函数每个实参的名空间和全局作用域内查找函数,即实参依赖查找(argument dependent lookup)。当然我们也可以把这个函数放在全局作用域里,但是这样做会显得代码不工整。这个方法既适用于类也适用于类模板,那看起来是不是比对std名空间进行特殊化舒服多了? 那不论对于类还是类模板是不是应该一直用这个方法? 但其实对std进行特殊化依然是有原因的,如果想让我们的swap函数适用于更多情况,那么除了在我们自己的名空间里写一个swap,在std里面依然要特殊化一个swap,下面就会讲到。目前为止我们都是以一个开发者的角度来思考问题,那么换做用户,假如你再写一个函数要用到swap功能来交换两个对象的数据:template
void doSomething(T& obj1, T& obj2){
...
swap(obj1,obj2);
..
}现在要使用哪个swap? 一定存在的std::swap,不一定存在的特殊化std::swap,还是也不一定存在的自定义swap? 最理想的情况是,使用对类型T具体的自定义swap,如果没有则使用std::swap:template
void doSomething(T1& obj1, T2& obj2){
..
using std::swap; //让std::swap对编译器可见
swap(obj1,obj2); //调用最好的swap
...
}当编译器看到要调用swap的时候,实参依赖查找会让编译器在全局作用域和实参的名空间里搜索。例如,如果T是Widget类型,那么编译器就会使用实参依赖查找找到Widget的名空间里的swap。如果没有的话,编译器只能报错。但是加了这行using语句,编译器便会找到std名空间里的swap。可如果我们不希望使用低效率的默认std::swap,就需要对其进行特殊化,这是依然需要特殊化std::swap的理由之一。如果两个名空间都找到了swap,编译器则会优先选择实参依赖查找的swap。但如果你写:std::swap(obj1,obj2); //std名空间资格限制这时编译器就只会在std里找到swap函数,那么我们自己名空间下的swap函数编译器连看都不会看。但是这样的代码还可能会藏在标准库或者其它库里的某处,因此对std::swap进行特殊化还是很有必要的,所以为了提升代码对不同情况的适应性,我们需要写自己的swap同时也要对std::swap进行特殊化,作为一个补救措施。现在我们讨论了默认的std::swap,特殊化的std::swap,以及在我们自定义的对类型T具体的swap,可能这章的内容有些多,我们先总结一下:如果默认的std::swap不会对效率产生比较大的影响,例如对象的成员数据不多,直接使用是没有问题的,就不用大费周章搞这些了如果默认的std::swap会对你的函数/类模板产生效率影响: 给你的类使用pimpl手法,然后给它写一个只交换指针的swap成员函数,而且这个函数禁止抛出异常,然后: 对于类模板,要在类模板相同的名空间下写一个自定义的swap,在里面调用swap成员函数对于类(不是类模板),还要给std::swap进行特殊化,也在它里面调用swap成员函数调用swap的时候确保加上using语句来让std名空间里面的swap对编译器可见,然后swap函数前不要加任何名空间资格限制(qualification)为什么成员函数swap不能抛出异常? 因为swap这个功能本身经常会被用来实现异常安全。但是非成员函数的swap则可能会抛出异常,因为它还包括了拷贝构造等功能,而这些功能则是允许抛出异常的。当你写一个高效的swap实现时,要记住不仅仅是为了高效,更要保证异常安全,但总体来讲,高效和异常安全是相辅相成的。总结:当默认的std::swap可能会拉低你自己的类的效率时,在自己的类里写一个swap成员函数,而且要保证它不会抛出异常写了swap成员函数,按照编程惯例还要写一个非成员swap函数,放在类或者类模板的名空间下,用它来调用成员swap函数。对于类(非模板),还要特殊化std::swap在调用swap时,要加上一句using std::swap,然后调用时不需要再加任何名空间资格限制为了自定义的类而完全特殊化std模板是没问题的,但千万不要给std里添加任何东西。发布于 2019-09-25 21:11C++计算机编程赞同 203 条评论分享喜欢收藏申请转载文章被以下专栏收录Effective C++ 读书笔记Effective C++干
【C语言】交换函数(swap) - 知乎切换模式写文章登录/注册【C语言】交换函数(swap)C语言资深大师这次我们要透过一个简单的函数swap入理解函数传参的本质以及在C中如何选择传参方式。首先,先来看第一段程序void swap(int x, int y) { int temp = y; y = x; x = temp;}通过main函数的调用,我们发现x,y并未实现交换:int main(){ int x = 1; int y = 37; swap(x, y); printf("x:%d; y:%d\n",x,y); return 0;}【原因解析】:整形x和y在函数swap内为按值传递,按值传递时,函数不会访问当前调用的实参。函数处理的值是它本地的拷贝,这些拷贝被存储在运行栈中,因此改变这些值不会影响实参的值。一旦函数结束了,函数的活动记录将从栈中弹出,这些局部值也就消失了。在按值传递的情况下,实参的内容没有被改变。这意味着程序员在函数调用时无需保存和恢复实参的值。如果没有按值传递机制,那么每个没有被声明为const 的参数就可能会随每次函数调用而被改变。按值传递的危害最小,需要用户做的工作也最少。毫无疑问,按值传递是参数传递合理的缺省机制。另外,如果作为实参的变量是一个大型类的对象,分配并拷贝到栈中的时间和空间开销往往过大。要实现swap函数的效果,我们应如何处理呢?第一个可行的做法是将形参声明成指针void pswap(int *x, int *y) { int temp = *y; *y = *x; //将x指针所指地址的值 赋值给 y指针所指地址;*x相当于一个整数,将其赋值给指针变量所指的地址 *x = temp;}在pswap函数中,由于传递的是两个变量的内存地址(指针),使得我们可以直接操作对应的值。实际上这里还是存在按值传递的问题(其实并没对x y本身做了改变,x y仍指向原来的地址,只是地址中的值发生了变化),只是由原先的整形传递变成了指针传递。我们可以修改指针指向的内存却依然无法修改指针本身。第二个可行的做法是将形参声明为指针的引用:void prswap(int *&x, int *&y) { int temp = *y; *y = *x; *x = temp;}void prswap(int *&x, int *&y) { int *temp = y; y = x; x = temp;}请注意,同一个函数原型下我提供了两种函数定义。可无论哪一种,在实参传递的阶段都不会发生按值传递的问题。那么两种定义到底哪一种更满足我们需求:(1)交换内存中的值(2)交换指针地址如果单独考虑本文的需求,第一种方法更满足。但是,如果我们需要交换的是一个大型类对象,第二种的效率则更高。总结:内存管理是C++学习的一个难点,初学者往往不容易掌握。但越是如此就越能体现一个开发者的语言内功。发布于 2022-04-02 18:56深度探索 C++ 对象模型(书籍)C语言函数赞同 7添加评论分享喜欢收藏申请
c++ STL交换算法:swap()、swap_ranges()、iter_swap详解 - 知乎首发于c++ 变异算法切换模式写文章登录/注册c++ STL交换算法:swap()、swap_ranges()、iter_swap详解Penguin身体和灵魂总有一个在路上主要函数有:swap():交换两个元素。swap_ranges():交换指定范围的元素。iter_swap():交换由迭代器所指的两个元素。swap函数模板的行为等同于:template
{
T c(std::move(a)); a=std::move(b); b=std::move(c);
}
template
{
for (size_t i = 0; i }两个相同模板参数类型变量的值互相交换。例子:#include #include #include #include using namespace std; int main(){ int a = 10; int b = 20; cout<< "原始数据 a = " << a << "\tb = " << b < swap(a, b); cout<< "交换后数据 a = " << a << "\tb = " << b < int a2[5] = {10, 20, 30, 40, 50}; int b2[5] = {15, 25, 35, 45, 55}; vector vector cout<< "原始 vector1 = "; copy(v1.begin(), v1.end(), ostream_iterator cout<< endl; cout<< "原始 vector2 = "; copy(v2.begin(), v2.end(), ostream_iterator cout<< endl; swap(v1, v2); cout<< "交换后 vector1 = "; copy(v1.begin(), v1.end(), ostream_iterator cout<< endl; cout<< "交换后 vector2 = "; copy(v2.begin(), v2.end(), ostream_iterator cout<< endl; return 0; }swap_ranges函数模板的行为等同于:template ForwardIterator2 swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2) { while (first1!=last1) { swap (*first1, *first2); ++first1; ++first2; } return first2; }这个算法需要 3 个正向迭代器作为参数。前两个参数分别是第一个序列的开始和结束迭代器,第三个参数是第二个序列的开始迭代器。并且这个算法会返回一个迭代器,它指向第二个序列的最后一个被交换元素的下一个位置。例子:#include #include #include #include using namespace std; int main(){ int a3[5] = {1, 2, 3, 4, 5}; int b3[5] = {6, 7, 8, 9, 10}; cout<< "原始 a3[5] = "; copy(a3, a3 + 5, ostream_iterator cout<< endl; cout<< "原始 b3[5] = "; copy(b3, b3 + 5, ostream_iterator cout<< endl; swap_ranges(a3, a3 + 3, b3); cout<< "交换后 a3[5] = "; copy(a3, a3 + 5, ostream_iterator cout<< endl; cout<< "交换后 b3[5] = "; copy(b3, b3 + 5, ostream_iterator cout<< endl; return 0; }iter_swap函数模板的行为等同于:template void iter_swap (ForwardIterator1 a, ForwardIterator2 b) { swap (*a, *b); }那么这三个函数到底有什么区别?哪些能互相代替?其实,通过swap函数原型swap(T & a,T &b)可明确看出它相当于引用调用,其余两个函数swap_ranges、iter_swap相当于地址指针调用。因此示例中:基本数据类型swap(a, b)可以用iter_swap(&a,&b)代替;基本序列容器swap(vl, v2)可以用iter_swap(&vl,&v2)代替,当然从功能上说也可用swap_ranges(vl. begin(),vl.end(),v2.begin())代替;但是对数组来说只能用swap_ranges,如示例那样。因此可以总结出:对于基本数据类型可用swap或iter_swap,对数组只能用swap_ranges,对基本序列容器三个函数均可。发布于 2023-01-08 15:33・IP 属地山西C++STLC / C++赞同 4添加评论分享喜欢收藏申请转载文章被以下专栏收录c++ 变异算法一起学习,一起自律q(≧▽ C++ std::swap 函数:交换变量值的利器
Runebook.dev
Documentation Contributors GitHub
Show English
简体中文
C++
Algorithm
C++ std::swap 函数:交换变量值的利器
C++ std::swap 函数std::swap 函数是 C++ 标准库中提供的用于交换两个变量的值的函数。它可以用于交换任何类型的变量,包括基本类型、指针、引用和对象。用法std::swap 函数的语法如下:std::swap(a, b); 其中,a 和 b 是要交换值的两个变量。示例代码以下示例演示了如何使用 std::swap 函数交换两个整数变量的值:int a = 10; int b = 20; std::swap(a, b); std::cout << "a = " << a << std::endl; // 输出:a = 20 std::cout << "b = " << b << std::endl; // 输出:b = 10 注释 std::swap 函数是 非成员函数,这意味着它不能直接用于成员变量。要交换成员变量的值,需要使用类成员函数或辅助函数。 std::swap 函数是 inline 函数,这意味着它会被编译器内联展开,从而提高代码执行效率。 std::swap 函数可以用于交换 任意类型的变量,包括基本类型、指针、引用和对象。 错误使用 std::swap 函数时,可能会发生以下错误: 编译错误:如果 a 和 b 的类型不匹配,则会导致编译错误。 运行时错误:如果 a 或 b 是空指针,则会导致运行时错误。 示例代码以下示例演示了使用 std::swap 函数交换两个指针的值:int* a = new int(10); int* b = new int(20); std::swap(a, b); std::cout << "*a = " << *a << std::endl; // 输出:*a = 20 std::cout << "*b = " << *b << std::endl; // 输出:*b = 10 delete a; delete b; 以下示例演示了使用 std::swap 函数交换两个对象的引用:class MyClass { public: int x; MyClass(int x) { this->x = x; } }; MyClass a(10); MyClass b(20); std::swap(a, b); std::cout << "a.x = " << a.x << std::endl; // 输出:a.x = 20 std::cout << "b.x = " << b.x << std::endl; // 输出:b.x = 10 总结std::swap 函数是 C++ 标准库中提供的用于交换两个变量的值的函数。它可以用于交换任何类型的变量,包括基本类型、指针、引用和对象。使用 std::swap 函数可以简化代码,提高代码执行效率。 std::swap 在标头 void swap( T& a, T& b ); (until C++11) template< class T > void swap( T& a, T& b ) noexcept( /* see below */ ); (since C++11) (until C++20) template< class T > constexpr void swap( T& a, T& b ) noexcept( /* see below */ ); (since C++20) (2) template< class T2, std::size_t N > void swap( T2 (&a)[N], T2 (&b)[N] ); (until C++11) template< class T2, std::size_t N > void swap( T2 (&a)[N], T2 (&b)[N] ) noexcept( /* see below */ ); (since C++11) (until C++20) template< class T2, std::size_t N > constexpr void swap( T2 (&a)[N], T2 (&b)[N] ) noexcept( /* 见下文 */ ); (since C++20) 交换给定的值。 1) 交换值 a 和 b 。除非 std::is_move_constructible_v 2) 交换阵列 a 和 b 。实际上调用 std::swap_ranges(a, a + N, b) 。除非 std::is_swappable_v Parameters a, b - 要交换的值 Type requirements - T 必须满足 CopyConstructible 和 CopyAssignable (C++11 之前)、 MoveConstructible 和 MoveAssignable (C++11 起)的要求 - T2 必须满足 Swappable 的要求。 Return value (none) Exceptions 1) (none) (until C++11) noexcept specification:noexcept( std::is_nothrow_move_constructible ) (since C++11) 2) noexcept specification:noexcept(noexcept(swap(*a, *b)))除了通常的查找规则找到的任何内容之外,异常规范中对标识符 swap 的查找还会找到此函数模板,从而使异常规范等效于 C++17 std::is_nothrow_swappable 。 (since C++11)(until C++17) noexcept specification:noexcept(std::is_nothrow_swappable_v Complexity 1) Constant 2) N 中的线性 Specializations 对于程序定义类型, std::swap 可能是 specialized in namespace std ,但 ADL 找不到此类专门化(命名空间 std 不是程序定义类型的关联命名空间)。 (until C++20) 使程序定义类型可交换的预期方法是在与类型相同的命名空间中提供非成员函数交换:有关详细信息,请参阅 Swappable 。 标准库已提供以下重载: std::swap(std::pair) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::tuple) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::shared_ptr) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::weak_ptr) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::unique_ptr) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::function) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::basic_string) 专门研究 std::swap 算法 (function template) std::swap(std::array) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::deque) 专门研究 std::swap 算法 (function template) std::swap(std::forward_list) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::list) 专门研究 std::swap 算法 (function template) std::swap(std::vector) 专门研究 std::swap 算法 (function template) std::swap(std::map) 专门研究 std::swap 算法 (function template) std::swap(std::multimap) 专门研究 std::swap 算法 (function template) std::swap(std::set) 专门研究 std::swap 算法 (function template) std::swap(std::multiset) 专门研究 std::swap 算法 (function template) std::swap(std::unordered_map) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::unordered_multimap) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::unordered_set) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::unordered_multiset) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::queue) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::priority_queue) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::stack) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::valarray) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::basic_stringbuf) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::basic_istringstream) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::basic_ostringstream) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::basic_stringstream) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::basic_filebuf) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::basic_ifstream) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::basic_ofstream) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::basic_fstream) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::basic_syncbuf) (C++20) 专门研究 std::swap 算法 (function template) std::swap(std::basic_spanbuf) (C++23) 专门研究 std::swap 算法 (function template) std::swap(std::basic_ispanstream) (C++23) 专门研究 std::swap 算法 (function template) std::swap(std::basic_ospanstream) (C++23) 专门研究 std::swap 算法 (function template) std::swap(std::basic_spanstream) (C++23) 专门研究 std::swap 算法 (function template) std::swap(std::basic_regex) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::match_results) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::thread) (C++11) 专门研究 std::swap 算法 (function) std::swap(std::unique_lock) (C++11) std::swap 对 unique_lock 的专业化 (function template) std::swap(std::shared_lock) (C++14) std::swap 对 shared_lock 的专业化 (function template) std::swap(std::promise) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::packaged_task) (C++11) 专门研究 std::swap 算法 (function template) std::swap(std::optional) (C++17) 专门研究 std::swap 算法 (function template) std::swap(std::any) (C++17) 专门研究 std::swap 算法 (function) std::swap(std::variant) (C++17) 专门研究 std::swap 算法 (function template) std::swap(std::basic_stacktrace) (C++23) 专门研究 std::swap 算法 (function template) swap(std::filesystem::path) (C++17) 交换两条路径 (function) swap(std::expected) (C++23) 专门研究 std::swap 算法 (function) swap(std::jthread) (C++20) 专门研究 std::swap 算法 (function) swap(std::move_only_function) (C++23) 重载 std::swap 算法 (function) swap(std::stop_source) (C++20) 专门研究 std::swap 算法 (function) swap(std::stop_token) (C++20) 专门研究 std::swap 算法 (function) Example #include #include namespace Ns { class A { int id {}; friend void swap(A& lhs, A& rhs) { std::cout << "swap(" << lhs << ", " << rhs << ")\n"; std::swap(lhs.id, rhs.id); } friend std::ostream& operator<<(std::ostream& os, A const& a) { return os << "A::id=" << a.id; } public: A(int i) : id {i} {} A(A const&) = delete; A& operator = (A const&) = delete; }; } int main() { int a = 5, b = 3; std::cout << a << ' ' << b << '\n'; std::swap(a, b); std::cout << a << ' ' << b << '\n'; Ns::A p {6}, q {9}; std::cout << p << ' ' << q << '\n'; // std::swap(p, q); // 错误,不满足类型要求 swap(p, q); // OK,ADL 找到合适的友元 `swap` std::cout << p << ' ' << q << '\n'; } Output: 5 3 3 5 A::id=6 A::id=9 swap(A::id=6, A::id=9) A::id=9 A::id=6 Defect reports 以下改变行为的缺陷报告追溯应用于之前发布的 C++ 标准。 DR Applied to 已发布的行为 Correct behavior LWG 227 C++98 T 不需要是 CopyConstructible 或 DefaultConstructible(可能无法构造 T 类型的临时对象) T 还需要be CopyConstructible LWG 809 C++98 数组无法交换 添加过载 (2) LWG 2554 C++11 交换多维数组永远不可能由于名称查找问题,为 noexcept 为工作而生 See also ranges::swap (C++20) 交换两个对象的值(自定义点对象) iter_swap 交换两个迭代器指向的元素 (function template) swap_ranges 交换两个范围的元素 (function template) exchange (C++14) 用新值替换参数并返回其先前的值 (function template) © cppreference.comLicensed under the Creative Commons Attribution-ShareAlike Unported License v3.0. https://en.cppreference.com/w/cpp/algorithm/swap
C++ 中如何使用 std::student_t_distribution::param 获取 t 分布参数
std::student_t_distribution::param 是 std::student_t_distribution 类的一个成员函数,用于获取或设置分布的参数。用法获取参数设置参数示例代码注释std::student_t_distribution::param 函数返回一个 param_type 对象,该对象包含分布的参数。
C++ std::bernoulli_distribution::reset 函数详解
如何使用 C++ std::discard_block_engine::max 函数获取随机数最大值
C++ std::basic_string_view::npos 概述
std::swap_ranges
std::transform
std::transform_exclusive_scan
std::transform_inclusive_scan
std::transform_reduce
std::unique
std::unique_copy
C++ 中 `std::chi_squared_distribution::operator()` 函数详解
C++ std::bernoulli_distribution::operator() 函数与其他随机数生成函数的比较
C++ ilogbl 函数用法详解
std::fesetenv 函数注意事项
std::fesetenv 函数用于设置浮点环境。浮点环境是指一组控制浮点运算行为的设置,例如舍入模式、异常处理方式等。用法std::fesetenv 函数的原型如下:其中:envp 指向一个 fenv_t 类型的对象,该对象保存了要设置的浮点环境。
C++ std::sin(std::complex) 函数C++ 标准
std::sin(std::complex) 函数计算复数的正弦值。它是 C++ 标准库中 complex 类提供的成员函数之一。用法该函数接受一个 std::complex 对象作为参数,并返回一个 std::complex 对象,其中包含该对象的正弦值。
何时使用 std::basic_string_view 替代 std::string
std::basic_string_view 是 C++ 标准库中引入的一个类,它表示对一段连续字符的只读视图。它类似于 std::string,但没有拥有权,也不允许修改内容。优势效率:std::basic_string_view 仅引用底层数据,无需复制,因此比 std::string 更高效。 Help us Improve Translation swap函数 - 知乎首页知乎知学堂发现等你来答切换模式登录/注册swap函数计算机中swap函数很多,在不同领域有不同的用法,但都是交换的意思。比如字符串交换(swap) 。 swap操作实现交换两个容器内所有元素的功能。要交换的容器的类型必须匹配: 必须是相同类型的容器…查看全部内容关注话题管理分享百科讨论精华视频等待回答简介计算机中swap函数很多,在不同领域有不同的用法,但都是交换的意思。比如字符串交换(swap) 。 swap操作实现交换两个容器内所有元素的功能。要交换的容器的类型必须匹配: 必须是相同类型的容器,而且所存储的元素类型也必须相同。调用了swap函数后,右操作数原来存储的元素被存放在左操作数中,反之亦然更多信息名称swap函数属于C语言启示不要直接用usingnamespacestd原因c++标准库函数里面的swap函数冲突了数据由搜狗百科提供查看百科全文 浏览量1.3 万讨论量4 帮助中心知乎隐私保护指引申请开通机构号联系我们 举报中心涉未成年举报网络谣言举报涉企侵权举报更多 关于知乎下载知乎知乎招聘知乎指南知乎协议更多京 ICP 证 110745 号 · 京 ICP 备 13052560 号 - 1 · 京公网安备 11010802020088 号 · 京网文[2022]2674-081 号 · 药品医疗器械网络信息服务备案(京)网药械信息备字(2022)第00334号 · 广播电视节目制作经营许可证:(京)字第06591号 · 服务热线:400-919-0001 · Investor Relations · © 2024 知乎 北京智者天下科技有限公司版权所有 · 违法和不良信息举报:010-82716601 · 举报邮箱:jubao@zhihu. C++ swap函数模板及其用法 首页 C语言教程 C++教程 Python教程 Java教程 Linux入门 更多>> 首页 > 编程笔记 C++ swap函数模板及其用法 在许多应用程序中,都有交换相同类型的两个变量内容的需要。例如,在对整数数组进行排序时,将需要一个函数来交换两个变量的值,如下所示:
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
而在对一个数组字符串对象进行排序的时候,会需要以下函数:
void swap(string &a, string &b)
{
string temp = a;
a = b;
b = temp;
}
因为这两个函数中代码的唯一区别就是被交换的变量的类型,所以这两个函数的逻辑与所有其他类似函数的逻辑都可以使用同一个模板函数来表示:
template void swap(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
这样的模板函数在标准 C++ 编译器附带的库中可用。该函数在
下面的程序演示了如何使用这个库模板函数来交换两个变量的内容:
// This program demonstrates the use of the swap function template.
#include #include #include using namespace std;
int main ()
{
// Get and swap two chars
char firstChar, secondChar;
cout << "Enter two characters: ";
cin >> firstChar >> secondChar;
swap(firstChar, secondChar);
cout << firstChar << " " << secondChar << endl;
// Get and swap two ints
int firstInt, secondInt;
cout << "Enter two integers: ";
cin >> firstInt >> secondInt;
swap(firstInt, secondInt);
cout << firstInt << " " << secondInt << endl;
// Get and swap two strings
cout << "Enter two strings: ";
string firstString, secondString;
cin >> firstString >> secondString;
swap(firstString, secondString);
cout << firstString << " " << secondString << endl;
return 0;
}
程序输出结果:
Enter two characters: a b
b a
Enter two integers: 12 45
45 12
Enter two strings: http://c.biancheng.net cyuyan
cyuyan http://c.biancheng.net 推荐阅读 Go语言内嵌结构体成员名字冲突 .pit视频播放器(播布客视频播放器) C++多继承时的对象内存模型 Shell函数返回值(return关键字) C语言推箱子小游戏源码下载和思路解析 C++ cout.write():输出字符串 HTML PLC是什么(超级详细) 多云和混合云介绍(超级详细) Vue ref()函数的用法 精美而实用的网站,分享优质编程教程,帮助有志青年。千锤百炼,只为大作;精益求精,处处斟酌;这种教程,看一眼就倾心。 关于网站 | 联系我们 | 网站地图 Copyright ©2012-2023 biancheng.net ↑ 谈谈C++中的swap函数_swap()-CSDN博客 谈谈C++中的swap函数 最新推荐文章于 2024-01-17 08:30:00 发布 置顶 ryfdizuo 最新推荐文章于 2024-01-17 08:30:00 发布 阅读量10w+ 收藏 102 点赞数 21 分类专栏: 随想&&感想 C++ 算法 文章标签: c++ string iterator vector debugging 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/ryfdizuo/article/details/6435847 版权 C++ 同时被 3 个专栏收录 153 篇文章 0 订阅 订阅专栏 随想&&感想 102 篇文章 0 订阅 订阅专栏 算法 62 篇文章 0 订阅 订阅专栏 1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符。 template { T c(a); a=b; b=c; } 需要构建临时对象,一个拷贝构造,两次赋值操作。 2,针对int型优化: void swap(int & __restrict a, int & __restrict b) { a ^= b; b ^= a; a ^= b; } 无需构造临时对象,异或 因为指针是int,所以基于这个思路可以优化1: template { unsigned char * pObj1 = reinterpret_cast unsigned char * pObj2 = reinterpret_cast for (unsigned long x = 0; x < sizeof(T); ++x) { pObj1[x] ^= pObj2[x]; pObj2[x] ^= pObj1[x]; pObj1[x] ^= pObj2[x]; } } 3,针对内建类型的优化: int, flaot, double 等,甚至重载运算符的用户自定义类型:向量,矩阵,图像等。。。 type a; -- e.g 10 type b; -- e.g 5 a = a+b ; -- a=15,b=5 b = a-b ; -- a=15,b=10 a= a -b ; -- a= 5,b=10 // 无需构造临时变量。使用基本运算操作符。 Ok, let's see. a = a + b; b = a - b; a = a - b; Let's introduce new names c = a + b; d = c - b; e = c - d; And we want to prove that d == a and e == b. d = (a + b) - b = a, proved. e = (a + b) - ((a + b) - b) = (a + b) - a = b, proved. For all real numbers. 4,swap的一些特化: std::string, std::vector各自实现了swap函数, string中 template class _Traits, class _Alloc> inline void __CLRCALL_OR_CDECL swap(basic_string<_Elem, _Traits, _Alloc>& _Left, basic_string<_Elem, _Traits, _Alloc>& _Right) { // swap _Left and _Right strings _Left.swap(_Right); } void __CLR_OR_THIS_CALL swap(_Myt& _Right) { // exchange contents with _Right if (this == &_Right) ; // same object, do nothing else if (_Mybase::_Alval == _Right._Alval) { // same allocator, swap control information #if _HAS_ITERATOR_DEBUGGING this->_Swap_all(_Right); #endif /* _HAS_ITERATOR_DEBUGGING */ _Bxty _Tbx = _Bx; _Bx = _Right._Bx, _Right._Bx = _Tbx; size_type _Tlen = _Mysize; _Mysize = _Right._Mysize, _Right._Mysize = _Tlen; size_type _Tres = _Myres; _Myres = _Right._Myres, _Right._Myres = _Tres; } else { // different allocator, do multiple assigns _Myt _Tmp = *this; *this = _Right; _Right = _Tmp; } } 第二个swap(Right)进行判断,如果使用了相同的分配器,则直接交换控制信息,否则调用string::operator=进行拷贝赋值。。。所以建议优先使用swap函数,而不是赋值操作符。 vector中 template class _Alloc> inline void swap(vector<_Ty, _Alloc>& _Left, vector<_Ty, _Alloc>& _Right) { // swap _Left and _Right vectors _Left.swap(_Right); } void swap(_Myt& _Right) { // exchange contents with _Right if (this == &_Right) ; // same object, do nothing else if (this->_Alval == _Right._Alval) { // same allocator, swap control information #if _HAS_ITERATOR_DEBUGGING this->_Swap_all(_Right); #endif /* _HAS_ITERATOR_DEBUGGING */ this->_Swap_aux(_Right); _STD swap(_Myfirst, _Right._Myfirst); _STD swap(_Mylast, _Right._Mylast); _STD swap(_Myend, _Right._Myend); } else { // different allocator, do multiple assigns this->_Swap_aux(_Right); _Myt _Ts = *this; *this = _Right; _Right = _Ts; } } vector的swap原理跟string完全一致,只有当当使用了不同分配器才进行字节拷贝。其余情况直接交换控制信息。 测试用例: 5,Copy and Swap idiom 目的:C++异常有三个级别:基本,强,没有异常。通过创建临时对象然后交换,能够实现重载赋值操作符的强异常安全的执行。 Loki中智能指针 临时变量跟this交换,临时变量自动销毁~ SmartPtr& operator=(SmartPtr { SmartPtr temp(rhs); temp.Swap(*this); return *this; } boost::share_ptr,share_ptr定义了自己的swap函数。 shared_ptr & operator=( shared_ptr const & r ) // never throws { this_type(r).swap(*this); return *this; } void swap(shared_ptr { std::swap(px, other.px); pn.swap(other.pn); } 记得本科上C++课,老师特别喜欢拿String来举例子,面试题也特别喜欢String。。。下面说说String::opreator=函数的优化: 最一般的写法,特点:使用const string& 传参防止临时对象。 String& String::operator =(const String & rhs) { if (itsString) delete [] itsString; itsLen = rhs.GetLen(); itsString = new char[itsLen+1]; for (unsigned short i = 0;i itsString[i] = rhs[i]; itsString[itsLen] = '/0'; return *this; } 优化1,防止自我间接赋值,a = b; c = b; a = c; 如果没有第一个if判断,当把c赋给a的时候,删除了a.itsString,后面的拷贝就会出错。注意是if(this==&rhs), 而不是if(*this==rhs) . String& String::operator =(const String & rhs) { if (this == &rhs) return *this; if (itsString) delete [] itsString; itsLen=rhs.GetLen(); itsString = new char[itsLen+1]; for (unsigned short i = 0;i itsString[i] = rhs[i]; itsString[itsLen] = '/0'; return *this; } 优化2,不进行拷贝赋值,只是交换控制信息,而且是强异常安全: String & String::operator = (String const &rhs) { if (this != &rhs) String(rhs).swap (*this); // Copy-constructor and non-throwing swap // Old resources are released with the destruction of the temporary above return *this; } 优化3,以最原始的传值方式传参,避免临时对象创建: String & operator = (String s) // the pass-by-value parameter serves as a temporary { s.swap (*this); // Non-throwing swap return *this; }// Old resources released when destructor of s is called. 最后这张方式主要是对C++新特性rvalue的优化,具体参见:http://en.wikibooks.org/wiki/More_C++_Idioms/Copy-and-swap 6. vector clear and swap trick vector.clear并只是将size变量置为0,并没有及时归还OS,STL仍然持有内存,以便后续push_back。实测如下: vector 增长vector然后清空: temp.resize( 1024*1024*20 ); // 80M temp.clear();此时资源管理器内存: clear以后进程兵没有及时将内存归还OS。。。通过swap方法: tmp.resize(1024*1024*20); // 80M // tmp.clear(); { std::vector }退出作用域,临时对象销毁。内存归还OS。此时资源管理器中进程内存回到1,864K。 附上网络版的String: #include #include using namespace std; class String { public: String(); String(const char *const); String(const String &); ~String(); char & operator[] (unsigned short offset); char operator[] (unsigned short offset)const; String operator+(const String&); void operator+=(const String&); String & operator= (const String &); unsigned short GetLen()const {return itsLen;} const char * GetString()const {return itsString;} private: String (unsigned short); char * itsString; unsigned short itsLen; }; String::String() { itsString = new char[1]; //为什么设置成1,这样会导致内存1bytes无法释放吗?我觉得和itsString = new char没区别,那他为什么要设置成1,这样有什么用?21天学会C++那本书,我也有 ,书上也确实是设置成1. itsString[0] = '/0'; itsLen=0; } String::String(unsigned short len) { itsString = new char[len+1]; for (unsigned short i =0;i<=len;i++) itsString[i] = '/0'; itsLen=len; } String::String(const char * const cString) { itsLen = strlen(cString); itsString = new char[itsLen+1]; for (unsigned short i=0;i itsString[i] = cString[i]; itsString[itsLen] = '/0'; } String::String(const String & rhs) { itsLen = rhs.GetLen(); itsString = new char[itsLen+1]; for (unsigned short i = 0;i itsString[i] = rhs[i]; itsString[itsLen] = '/0'; } String::~String() { delete [] itsString; itsLen = 0; } String& String::operator =(const String & rhs) { if (this == &rhs) return *this; delete [] itsString; itsLen=rhs.GetLen(); itsString = new char[itsLen+1]; for (unsigned short i = 0;i itsString[i] = rhs[i]; itsString[itsLen] = '/0'; return *this; } char & String::operator [](unsigned short offset) //这个程序这样写,起到了什么用处??和main中的那一个对应? { if (offset > itsLen) return itsString[itsLen-1]; //这个返回itslen-1到底是什么意思?为什么要减去1 ?? else return itsString[offset]; } char String::operator [](unsigned short offset)const { if (offset > itsLen) itsString[itsLen-1]; else return itsString[offset]; } String String::operator +(const String& rhs) { unsigned short totalLen = itsLen + rhs.GetLen(); String temp(totalLen); unsigned short i; for (i=0;i temp[i] = itsString[i]; for (unsigned short j = 0;j temp[i] = rhs[j]; temp[totalLen] = '/0'; return temp; } void String::operator +=(const String& rhs) { unsigned short rhsLen = rhs.GetLen(); unsigned short totalLen = itsLen + rhsLen; String temp(totalLen); unsigned short i; for (i = 0;i temp[i] = itsString[i]; for (unsigned short j = 0;j temp[i] = rhs[i-itsLen]; temp[totalLen] = '/0'; } int main() { String s1("initial test"); //调用了什么函数? cout<<"S1:/t"< char *temp ="Hello World"; s1 = temp;//调用了什么函数? cout<<"S1:/t"< char tempTwo[20]; strcpy(tempTwo,"; nice to be here!"); s1 += tempTwo; cout<<"tempTwo:/t"< cout<<"S1:/t"< cout<<"S1[4]:/t"< cout<<"S1[999]:/t"< String s2(" Anoter string");//调用了什么函数? String s3; s3 = s1+s2; cout<<"S3:/t" < String s4; s4 = "Why does this work?";//调用了什么函数? cout<<"S4:/t"< return 0; } 参考引用: 1,http://www.vbforums.com/showthread.php?t=245517 2,http://www.cplusplus.com/reference/algorithm/swap/ 3,http://codeguru.earthweb.com/forum/showthread.php?t=485643 4,http://stackoverflow.com/questions/1998744/benefits-of-a-swap-function 5,http://answers.google.com/answers/threadview/id/251027.html C++ idioms http://en.wikibooks.org/wiki/Category:More_C%2B%2B_Idioms Copy and Swap idiom http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom History: 20140401 - add 6 vector clear and swap trick! 优惠劵 ryfdizuo 关注 关注 21 点赞 踩 102 收藏 觉得还不错? 一键收藏 知道了 6 评论 谈谈C++中的swap函数 1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符。template void swap ( T& a, T& b ){ T c(a); a=b; b=c;} 需要构建临时对象,一个拷贝构造,两次赋值操作。2,针对int型优化:void swap(int & __restrict a, int & __restrict b){a ^= b;b ^= a 复制链接 扫一扫 专栏目录 交换函数2_swap_c++交换函数_ 10-03 能够实现参数的交换,swap函数利用变量的引用实现 c++ 中的swap 函数的用法 BLOG OF PETERMAOSX. 08-07 5912 c++ 中的swap 函数是在 std标准库里的函数 可以用来交换两个值 #include using namespace std; //测试程序 int main() { int a = 10; int b = 99;C++ std::swap 函数:交换变量值的利器
swap函数 - 知乎
C++ swap函数模板及其用法
谈谈C++中的swap函数_swap()-CSDN博客
>