盐城网站开发,西安企业家名单,个人网站做seo,国外点击链接推广平台C函数与string对象、array对象及递归详解
一、string对象的数组操作
string对象比C风格字符串更灵活#xff0c;可以像结构体一样进行赋值和传递。以下示例展示了string数组的用法#xff1a;
#include iostream
#include string
using namespace std;const …C函数与string对象、array对象及递归详解一、string对象的数组操作string对象比C风格字符串更灵活可以像结构体一样进行赋值和传递。以下示例展示了string数组的用法#includeiostream#includestringusingnamespacestd;constintSIZE5;voiddisplay(conststring sa[],intn);intmain(){string list[SIZE];coutEnter your SIZE favorite astronomical sights:\n;for(inti0;iSIZE;i){couti1: ;getline(cin,list[i]);}cout\nYour list:\n;display(list,SIZE);return0;}voiddisplay(conststring sa[],intn){for(inti0;in;i)couti1: sa[i]endl;}关键点string对象数组声明string list[SIZE];每个元素都是完整的string对象可以像基本类型一样操作二、array对象的函数参数传递C11的array模板类提供了更好的数组安全性#includeiostream#includearray#includestringconstintSeasons4;constarraystring,SeasonsSnames{Spring,Summer,Fall,Winter};// 按值传递用于显示voidshow(arraydouble,Seasonsda);// 按地址传递用于修改voidfill(arraydouble,Seasons*pa);intmain(){arraydouble,Seasonsexpenses;fill(expenses);// 传递地址show(expenses);// 传递值副本return0;}voidfill(arraydouble,Seasons*pa){usingnamespacestd;for(inti0;iSeasons;i){coutEnter Snames[i] expenses: ;cin(*pa)[i];// 注意解引用语法}}voidshow(arraydouble,Seasonsda){usingnamespacestd;doubletotal0.0;cout\nEXPENSES\n;for(inti0;iSeasons;i){coutSnames[i]: $da[i]endl;totalda[i];}coutTotal expenses: $totalendl;}重要区别show(expenses)按值传递操作副本fill(expenses)按地址传递操作原始数据三、递归函数详解1. 单递归调用#includeiostreamusingnamespacestd;voidcountdown(intn);intmain(){countdown(4);return0;}voidcountdown(intn){coutCounting down ... nendl;if(n0)countdown(n-1);// 递归调用coutn: Kaboom!\n;}输出分析Counting down ... 4 (第1层调用n4) Counting down ... 3 (第2层调用n3) Counting down ... 2 (第3层调用n2) Counting down ... 1 (第4层调用n1) Counting down ... 0 (第5层调用n0) 0: Kaboom! (第5层返回) 1: Kaboom! (第4层返回) 2: Kaboom! (第3层返回) 3: Kaboom! (第2层返回) 4: Kaboom! (第1层返回)递归特点每次调用创建独立的变量副本递归深度有限制通常受栈空间限制必须有终止条件否则无限递归2. 多递归调用分而治之#includeiostreamconstintLen66;constintDivs6;voidsubdivide(charar[],intlow,inthigh,intlevel);intmain(){charruler[Len];// 初始化标尺for(inti1;iLen-2;i)ruler[i] ;ruler[Len-1]\0;ruler[0]ruler[Len-2]|;std::coutrulerstd::endl;// 递归细分for(inti1;iDivs;i){subdivide(ruler,0,Len-2,i);std::coutrulerstd::endl;// 重置中间标记准备下一轮for(intj1;jLen-2;j)ruler[j] ;}return0;}voidsubdivide(charar[],intlow,inthigh,intlevel){if(level0)// 终止条件return;intmid(highlow)/2;ar[mid]|;// 左右分别递归subdivide(ar,low,mid,level-1);subdivide(ar,mid,high,level-1);}输出特点每次递归将当前段分为两半分治策略的典型应用可用于绘制标尺、二分查找等场景四、最佳实践建议string vs C风格字符串优先使用string更安全方便string对象自动管理内存array vs 原生数组array知道自身大小size()方法更好的类型安全性支持迭代器操作递归使用注意事项// 正确示例有明确终止条件intfactorial(intn){if(n1)return1;// 终止条件returnn*factorial(n-1);// 递归调用}// 错误示例缺少终止条件无限递归voidinfinite(){infinite();// 危险}递归优化深度过大可能导致栈溢出考虑尾递归优化或迭代替代使用备忘录memoization避免重复计算五、总结本文介绍了C中三类重要的编程技术string对象数组操作、array模板类的函数参数传递以及递归函数的原理和应用。掌握这些技术能让你更安全地处理字符串和数组理解值传递和地址传递的区别掌握递归思维解决分治类问题递归虽强大但需谨慎使用。确保有明确的终止条件并注意递归深度限制。对于性能敏感的场景考虑使用迭代替代递归。