news 2026/2/27 22:44:18

C++函数与string对象、array对象及递归详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++函数与string对象、array对象及递归详解

C++函数与string对象、array对象及递归详解

一、string对象的数组操作

string对象比C风格字符串更灵活,可以像结构体一样进行赋值和传递。以下示例展示了string数组的用法:

#include<iostream>#include<string>usingnamespacestd;constintSIZE=5;voiddisplay(conststring sa[],intn);intmain(){string list[SIZE];cout<<"Enter your "<<SIZE<<" favorite astronomical sights:\n";for(inti=0;i<SIZE;i++){cout<<i+1<<": ";getline(cin,list[i]);}cout<<"\nYour list:\n";display(list,SIZE);return0;}voiddisplay(conststring sa[],intn){for(inti=0;i<n;i++)cout<<i+1<<": "<<sa[i]<<endl;}

关键点:

  • string对象数组声明:string list[SIZE];
  • 每个元素都是完整的string对象
  • 可以像基本类型一样操作

二、array对象的函数参数传递

C++11的array模板类提供了更好的数组安全性:

#include<iostream>#include<array>#include<string>constintSeasons=4;constarray<string,Seasons>Snames={"Spring","Summer","Fall","Winter"};// 按值传递(用于显示)voidshow(array<double,Seasons>da);// 按地址传递(用于修改)voidfill(array<double,Seasons>*pa);intmain(){array<double,Seasons>expenses;fill(&expenses);// 传递地址show(expenses);// 传递值(副本)return0;}voidfill(array<double,Seasons>*pa){usingnamespacestd;for(inti=0;i<Seasons;i++){cout<<"Enter "<<Snames[i]<<" expenses: ";cin>>(*pa)[i];// 注意解引用语法}}voidshow(array<double,Seasons>da){usingnamespacestd;doubletotal=0.0;cout<<"\nEXPENSES\n";for(inti=0;i<Seasons;i++){cout<<Snames[i]<<": $"<<da[i]<<endl;total+=da[i];}cout<<"Total expenses: $"<<total<<endl;}

重要区别:

  • show(expenses):按值传递,操作副本
  • fill(&expenses):按地址传递,操作原始数据

三、递归函数详解

1. 单递归调用

#include<iostream>usingnamespacestd;voidcountdown(intn);intmain(){countdown(4);return0;}voidcountdown(intn){cout<<"Counting down ... "<<n<<endl;if(n>0)countdown(n-1);// 递归调用cout<<n<<": Kaboom!\n";}

输出分析:

Counting down ... 4 (第1层调用,n=4) Counting down ... 3 (第2层调用,n=3) Counting down ... 2 (第3层调用,n=2) Counting down ... 1 (第4层调用,n=1) Counting down ... 0 (第5层调用,n=0) 0: Kaboom! (第5层返回) 1: Kaboom! (第4层返回) 2: Kaboom! (第3层返回) 3: Kaboom! (第2层返回) 4: Kaboom! (第1层返回)

递归特点:

  • 每次调用创建独立的变量副本
  • 递归深度有限制(通常受栈空间限制)
  • 必须有终止条件(否则无限递归)

2. 多递归调用(分而治之)

#include<iostream>constintLen=66;constintDivs=6;voidsubdivide(charar[],intlow,inthigh,intlevel);intmain(){charruler[Len];// 初始化标尺for(inti=1;i<Len-2;i++)ruler[i]=' ';ruler[Len-1]='\0';ruler[0]=ruler[Len-2]='|';std::cout<<ruler<<std::endl;// 递归细分for(inti=1;i<=Divs;i++){subdivide(ruler,0,Len-2,i);std::cout<<ruler<<std::endl;// 重置中间标记(准备下一轮)for(intj=1;j<Len-2;j++)ruler[j]=' ';}return0;}voidsubdivide(charar[],intlow,inthigh,intlevel){if(level==0)// 终止条件return;intmid=(high+low)/2;ar[mid]='|';// 左右分别递归subdivide(ar,low,mid,level-1);subdivide(ar,mid,high,level-1);}

输出特点:

  • 每次递归将当前段分为两半
  • 分治策略的典型应用
  • 可用于绘制标尺、二分查找等场景

四、最佳实践建议

  1. string vs C风格字符串

    • 优先使用string,更安全方便
    • string对象自动管理内存
  2. array vs 原生数组

    • array知道自身大小(size()方法)
    • 更好的类型安全性
    • 支持迭代器操作
  3. 递归使用注意事项

    // 正确示例:有明确终止条件intfactorial(intn){if(n<=1)return1;// 终止条件returnn*factorial(n-1);// 递归调用}// 错误示例:缺少终止条件(无限递归)voidinfinite(){infinite();// 危险!}
  4. 递归优化

    • 深度过大可能导致栈溢出
    • 考虑尾递归优化或迭代替代
    • 使用备忘录(memoization)避免重复计算

五、总结

本文介绍了C++中三类重要的编程技术:string对象数组操作、array模板类的函数参数传递,以及递归函数的原理和应用。掌握这些技术能让你:

  • 更安全地处理字符串和数组
  • 理解值传递和地址传递的区别
  • 掌握递归思维,解决分治类问题

递归虽强大,但需谨慎使用。确保有明确的终止条件,并注意递归深度限制。对于性能敏感的场景,考虑使用迭代替代递归。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/23 1:40:56

把 SAP ABAP 的消息与异常处理做成标准件:从 MESSAGE 到 TRY ... CATCH 的工程化落地

在 SAP 系统里写程序,难点往往不在业务逻辑本身,而在失败时怎么失败:用户看到什么提示、后台作业怎么留痕、接口调用方如何拿到可处理的错误、以及出了问题能不能快速定位。消息与错误处理如果没有统一标准,结果通常是两类极端:要么满屏MESSAGE E...把用户“堵死”,要么关…

作者头像 李华
网站建设 2026/2/6 22:36:36

强软弱虚引用如何理解

强引用&#xff1a;我们平时最常使用的基本对象引用&#xff0c;JVM不会回收强引用类型对象&#xff0c;即使内存不足导致OOM也不会回收。实现一个强引用User user new User()软引用&#xff1a;内存空间足够的情况下&#xff0c;JVM不会回收软引用对象&#xff0c;如果内存空…

作者头像 李华
网站建设 2026/2/26 23:52:48

PyTorch官方安装命令在Miniconda-Python3.9中的实际应用

PyTorch 官方安装命令在 Miniconda-Python3.9 中的实践指南 在深度学习项目中&#xff0c;一个稳定、可复现的开发环境往往是成功的第一步。然而&#xff0c;许多开发者都曾经历过这样的场景&#xff1a;本地训练模型一切正常&#xff0c;换到服务器上却因版本冲突报错&#x…

作者头像 李华
网站建设 2026/2/24 19:21:16

PyTorch Hub模型加载失败?检查Miniconda-Python3.9网络配置

PyTorch Hub模型加载失败&#xff1f;检查Miniconda-Python3.9网络配置 在深度学习项目开发中&#xff0c;你是否曾遇到这样的场景&#xff1a;满怀期待地写下 torch.hub.load(pytorch/vision, resnet50)&#xff0c;结果却卡在下载环节&#xff0c;报出一连串 URLError 或 SSL…

作者头像 李华
网站建设 2026/2/8 18:47:02

Miniconda-Python3.9如何支持PyTorch与MLflow集成追踪实验

Miniconda-Python3.9 如何支持 PyTorch 与 MLflow 集成追踪实验 在现代机器学习研发中&#xff0c;一个常见的困扰是&#xff1a;昨天还能跑通的实验&#xff0c;今天却因为环境变动、依赖升级或配置差异而失败。更糟糕的是&#xff0c;当你试图复现某次“效果特别好”的训练结…

作者头像 李华
网站建设 2026/2/27 6:26:53

Mysql字段判空实用技巧

文章目录背景函数判空素材方案一、case函数方案二、nullif函数背景 在日常SQL处理中&#xff0c;如何对字段的空值进行处理&#xff0c;记录下来&#xff0c;方便备查。 函数判空 MySQL中可使用【ifnull】函数&#xff0c;该函数对空值可以判断&#xff0c;即数据库中值为【…

作者头像 李华