跟我从零开始学STL(STL代码基础01)---string容器

引言

  小伙伴们大家好,又到了新的篇章了,感谢大家的支持!今天我们要学一个新的篇章,STL。在编程领域,STL(Standard Template Library,标准模板库)是C++语言中非常重要的一部分。它为我们提供了大量常用数据结构和算法的模板实现,极大地提高了编程效率。

  今天,小杨将带领大家从零开始学习STL,首先为大家介绍的是string容器。string容器在日常生活中有着广泛的应用,如文本处理、字符串操作等。希望通过本文,能让您对string容器有一个初步的了解,为后续学习打下坚实基础。好了,废话不多说,小伙伴们跟着小杨同学一起,让我们开始吧!

  冲冲冲!!!!冲呀!!!

STL介绍

  STL(standard template library),叫做标准模板库,可以帮我们建立一套数据结构和算法的标准,提高复用性。STL中大量使用了模板技术。

STL中有三大部分:
容器:container,存放数据的地方,STL中实现了很多种数据结构的容器。
算法:algorithm,操作数据的方法,解决问题的方法。
迭代器:iterator,迭代器就是操作容器中数据的指针,它是对原始指针的封装,本质上是一个类模板,同时重载了指针的各种运算符。

String容器

1.概念

  string是STL中的一种容器,是一种特殊的容器,它的元素只能char类型,本质上是个类。
string和char*的区别:

  • 1.har*是指针,string是一个类,类内部封装了char*
  • 2.string管理char*所分配的内存,不用担心越界的问题
  • 3.string类内部提供了很多方法供我们使用string类提供的函数

2.string构造

  • string();//创建一个空的字符串
  • string(const char* s);//使用字符串s来初始化string对象
  • string(const string& str);//使用string对象str来初始化string对象
  • string(int n,char c);//使用n个字符c来初始化string对象
  • 代码示例:
void test01()
{string s1;//无参构造cout << "s1=" << s1 << endl;const char* str = "hello world";string s2(str);cout << "s2=" << s2 << endl;string s3(s2);cout << "s3=" << s3 << endl;string s4(10, 'a');//10个a组成的字符串cout << "s4=" << s4 << endl;
}

3.string赋值操作

  • 重载赋值运算符:
    • string& operator=(const char* s);//字符串常量赋值
    • string& operator=(const string& s);//string对象的赋值
    • string& operator=(char c);//单个字符赋值
  • 赋值函数assign():
    • string& assign(const char* s);//字符串常量赋值
    • string& assign(const char* s,int n);//将字符串s的前n个字符赋值给string
    • string& assign(const string& s);//使用string对象完成赋值
    • string& assign(int n,char c);//使用n个字符c来赋值
  • 代码示例:
void test02()
{//赋值运算符string str1;str1 = "hello world";cout << "str1=" << str1 << endl;string str2;str2 = str1;cout << "str2=" << str2 << endl;string str3;str3 = 'A';cout << "str3=" << str3 << endl;//赋值函数assignstring str4;str4.assign("hello C++");cout << "str4=" << str4 << endl;string str5;str5.assign("hello C++", 5);cout << "str5=" << str5 << endl;string str6;str6.assign(str5);cout << "str6=" << str6 << endl;string str7;str7.assign(5, 'x');cout << "str7=" << str7 << endl;
}

4.string字符串拼接

  • 在字符串末尾拼接字符串
    重载运算符+=:
    string& operator+=(const char* s);
    string& operator+=(const string& str);
    string& operator+=(char c);

  • append函数:
    string& append(const char* s);
    string& append(const char* s,int n);//把字符串s的前n个字符拼接到string字符串

  • 代码示例:

void test03()
{//运算符+=string str1 = "我";str1 += "爱玩游戏";cout << "str1=" << str1 << endl;str1 += ':';cout << "str1=" << str1 << endl;string str2 = "LOL DNF";str1 += str2;cout << "str1=" << str1 << endl;//拼接函数appendstring str3 = "I";str3.append(" like ");str3.append("play game such as ", 10);str3.append(str2, 4, 3);cout << "str3=" << str3 << endl;
}

5.string查找和替换

  查找:查找指定的字符串是否存在,找到会返回对应的位置,找不到返回-1(-1即string::npos),查找是常函数

  • 从左往右查找:find
    int find(const string& str,int pos=0) const;//查找字符串str,返回它第一次出现的位置,从pos位置开始找,pos默认值是0,即开头位置
    int find(const char* s,int pos=0) const;
    int find(const char* s,int pos=0,int n) const;//从pos位置开始查找字符串s的前n个字符第一次出现的位置
    int find(char c,int pos=0) const;//从pos位置查找字符c第一次出现的位置

  • 从右往左查找:rfind
    int rfind(const string& str,int pos=npos) const;//从右往左查找str最后一次出现的位置,从pos位置开始查找,pos默认值是npos,npos是string类的静态常量,表示字符串结束
    int rfind(const char* s,int pos=npos) const;
    int rfind(const string& s,int pos=npos,int n) const;//从pos开始从右往左查找s字符串的前n个字符最后一次出现的位置
    int rfind(char c,int pos=npos) const;

  • 替换:在指定的位置替换字符串
    string& replace(int pos,int n,const string& str);//从pos位置开始的n个字符被替换为字符串str
    string& replace(int pos,int n,const char* s);//从pos位置开始的n个字符被替换为字符串s

  • 代码示例:

void test04()
{//从左往右找string str1 = "abcdefgde";int pos=str1.find("de");cout << "第一个de的位置:" << pos << endl;//3pos = str1.find("de", 5);cout << "第二个de的位置:" << pos << endl;//7pos = str1.find("fgde",0,2);cout << "fg的位置:" << pos << endl;//5pos = str1.find('f');cout << "f的位置:" << pos << endl;//5//从右往左找cout << "从右往左找:" << endl;pos = str1.rfind("de");cout << "第一个de的位置:" << pos << endl;//7pos = str1.rfind("de", 5);cout << "第二个de的位置:" << pos << endl;//3pos = str1.rfind("fgde",-1,2);cout << "fg的位置:" << pos << endl;//5pos = str1.rfind('d');cout << "d的位置:" << pos << endl;//7//替换str1.replace(1,3,"888");cout << "被替换后,str1=" << str1 << endl;
}

6.string字符串比较

  比较方式:是按照字符串中每个字符的ASCII码逐个比较,如果比较出大小就返回结果,如果直到结束都没有比较出大小,证明两个字符串相等。
  所以,比较方法主要的作用就是判断两个字符串是否相等,至于大小没实际意义。
返回值:相等的时候返回0,大于的时候返回1,小于返回-1

int compare(const string& str) const;//当前字符串跟字符串str比较
int compare(const char* s) const;//当前字符串跟字符串s比较
  • 代码示例:
void test05()
{string s1 = "hello";string s2 = "hello";string s3 = "Hello";cout << s1.compare(s2) << endl;//0cout << s1.compare(s3) << endl;//1
}

7.string插入和删除

  • 插入:
    string& insert(int pos,const char* s);//在pos位置插入字符串s
    string& insert(int pos,const string& str);//在pos位置插入字符串str
    string& insert(int pos,int n,char c);//在pos位置插入n个字符c

  • 删除:
    string& erase(int pos,int n);//删除从pos开始的n个字符

  • 代码示例:

void test06()
{string str = "hello world";str.insert(1, "888");cout << "str=" << str << endl;str.insert(1, 3, 'a');cout << "str=" << str << endl;str.erase(1, 6);cout << "str=" << str << endl;
}

8.string截取子字符串

  从字符串中截取想要的子字符串
string& substr(int pos,int n=npos) const;//返回从pos开始的n个字符组成的子字符串,n的默认值是npos,代表最后

9.获取长度

  size():获取字符串的长度,也就是字符数

  • 代码示例:

void test07()
{string str = "abcdefg";string subString1 = str.substr(1, 3);cout << subString1 << endl;string subString2 = str.substr(3);//第二个参数取默认值npos,代表截取到最后cout << subString2 << endl;cout << "str的长度:" << str.size() << endl;
}

10.string元素的存取

string中单个字符存取可以通过下面两个方式:

  • char& operator[](int n);//运算符重载,通过[index]取值,index代表下标
  • char& at(int n);//通过at成员函数取值,n也是下标
  • 代码示例:
void test08()
{//取,查询string str = "hello world";cout << str[6] << endl;//wcout << str << endl;//逐个输出每个字符for (int i = 0; i < str.size(); i++){cout << str[i];}cout << endl;cout << str.at(6)<<endl;//存,修改str[0] = 'H';str.at(6) = 'W';cout << str << endl;
}

小练习:

  • 练习1:完成string类型字符串和char*类型字符串之间的相互转换
  • 代码注解:
void test09()
{//char*转string,构造函数即可完成const char* s1 = "welcome to china!";string s2(s1);cout << s2 << endl;//string转char*,string是对char*的封装,而字符串用的是首字符的地址来表示,//所以只需要拿到string中首个字符的地址,就是原始字符串的表示方式string s3 = "hello world";char* s= &s3[0];cout << s << endl;//还可以利用c_str()函数完成转换string s4 = "let it be";const char* c = s4.c_str();cout << c << endl;
}
  • 练习2:写一个函数,将一个string邮箱地址的用户名取出来并返回,比如hello@sina.com,返回hello
  • 代码注解:
string get_email_username(string& s)
{//思路:用户名即首字符到@符之间的字符,查找@,找到@的下标位置,然后根据这个位置截取int pos = s.find('@');string username = s.substr(0,pos);return username;
}
void test10()
{string email_1 = "hello@sina.com";string email_2 = "297979279@qq.com";cout << get_email_username(email_1) << endl;cout << get_email_username(email_2) << endl;
}
  • 练习3.实现string字符串的大小写转换
  • 代码注解:
//思路:利用ASCII码将某个英文字符转换成它对应的大小写,大小写字母的ASCII码只差是32
void upper_or_lower(string& str)
{for (int i = 0; i < str.size(); i++){//区分大小写if (str[i]>=65 and str[i]<=90)//大写,就转小写,ASCII码+32{str[i] = str[i] + 32;}else//小写,就转大写,-32{str[i] = str[i] - 32;}}
}
//除了ASCII码,还可以通过两个函数完成单个字符的大小写转换:tolower()和toupper()
void upper_or_lower_def(string& str)
{for (int i = 0; i < str.size(); i++){//区分大小写if (str[i] >= 65 and str[i] <= 90)//大写,就转小写,ASCII码+32{str[i] = tolower(str[i]);}else//小写,就转大写,-32{str[i] = toupper(str[i]);}}
}
void test11()
{string s1 = "hello";string s2 = "WORLD";//upper_or_lower(s1);//upper_or_lower(s2);upper_or_lower_def(s1);upper_or_lower_def(s2);cout << s1 << endl;cout << s2 << endl;
}

结语

  经过本文的介绍和练习,相信小伙伴们对string容器已经有了一定的认识。掌握string容器的基本用法,能让我们在处理字符串问题时更加得心应手。当然,STL的内容非常丰富,string容器只是其中的一小部分。

  在今后的学习中,我们将继续探讨其他容器和算法,逐步揭开STL的神秘面纱。希望大家能跟着我的步伐,一起探索C++编程的乐趣。如有疑问,欢迎在评论区留言交流,我们共同进步!谢谢阅读,下期再见!

  学到这里的同学给自己鼓掌👏👏👏👏👏👏👏👏👏

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

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

相关文章

zabbix 学习笔记

文章目录 Zabbix 安装Ubuntu 18.04.1 server 安装Zabbix 4.0Centos7 安装Zabbix3.4Centos7 安装zabbix4.2Centos7.1908安装zabbix 基于ngixDebian11安装zabbix6.0LTS 基于PostgreSQL和NGINXAlmaLinux9.2使用国内清华源在线安装zabbix6.0.18LTS 基于MySQL和NGINXUbunut22.04使用…

crewAI中通过Ollama调用本地模型的两种方式

0 背景 crewAI中默认使用的gpt4的模型&#xff0c; 在环境中配置OPENAI_API_KEY即可使用。 但openai的api毕竟是要花钱的&#xff0c; 况且现在对大陆地区做了封禁&#xff0c; 使用起来不是那么方便。 而Ollama可以方便的运行本地的大模型&#xff0c; 既不用花钱&#xff0c…

图文讲解IDEA如何导入JDBC驱动包

前言 学习JDBC编程,势必要学会如何导入驱动包,这里笔者用图文的方式来介绍 视频版本在这里 50秒教你怎么导入驱动包然后进行JDBC编程的学习_哔哩哔哩_bilibili 忘记录音频了,大伙凑合着看 下载驱动包 https://mvnrepository.com/artifact/mysql/mysql-connector-java 去中…

GB28181设备如何添加

简介 此篇描述视频网关&#xff08;中间件&#xff09;接入大华、海康、ONVIF设备&#xff08;NVR、摄像头&#xff09;、GB28181设备步骤和流程。 阅读本文档之前建议先阅览视频网关&#xff08;中间件&#xff09;用户使用手册。 接入方式和说明 视频网关&#xff08;中间…

Flutter——最详细(GestureDetector)使用教程

背景 组件手势检测&#xff0c;单击、双击、长按、松开、移动、横向拖动、竖向拖动等事件 属性作用onTap单击onDoubleTap双击onLongPress长按onPanUpdate拖动实时更新onHorizontalDragDown横向点击onVerticalDragDown竖向点击 GestureDetector(onTap: () > setState(() >…

论文学习_Getafix: learning to fix bugs automatically

1. 引言 研究背景:现代生产代码库极其复杂并且不断更新。静态分析器可以帮助开发人员发现代码中的潜在问题(在本文的其余部分中称为错误),这对于在这些大型代码库中保持高代码质量是必要的。虽然通过静态分析尽早发现错误是有帮助的,但修复这些错误的问题在实践中仍然主要…

ZP-UHZ系列顶装式磁翻板液位计

一、用途及特点 ZP-UHZ系列磁浮子液位计是一种能就地指示或远传显示与控制的物位仪表&#xff0c;它广泛用于石油、化工、轻工、电力、核工业以及食品、医药等工业中&#xff0c;对各种塔、罐、槽、箱等容器中介质的液位进行指示和控制。 ZP-UHZ系列磁浮子液位计的指示部分及发…

jmeter-beanshell学习7-props获取全局变量和设置全局变量

继续写点不痛不痒的小东西。第一篇写了vars设置变量&#xff0c;但是vars只能作用在同一个线程组。跨线程组情况比较少&#xff0c;要是用到跨线程组&#xff0c;有个pros&#xff0c;用法和vars一样。 在setup线程组设置变量a&#xff0c;执行的时候&#xff0c;jmeter会先执行…

第二证券:转股溢价率是什么意思?高好还是低好?

转股溢价率是指可转债在商场上的交易价格相对于其转股价值的溢价份额&#xff0c;能够用来衡量投资者为取得将债券转换为股票权力而付出的额定金额&#xff0c;是可转债的重要指标。 转股溢价率的核算公式为&#xff1a;溢价率&#xff1d;&#xff08;转债价格-转股价值&…

MySql性能调优01-[数据结构和索引]

数据结构和索引 什么是索引索引的种类常见索引数据结构和区别二叉树 红黑树 什么是索引 索引的种类 在Mysql中索引是在存储引擎层实现的&#xff0c;而不是在服务层实现的 按数据结构分&#xff1a;Btree索引、Hash索引、Full-text索引按存储结构分&#xff1a;聚簇索引、非聚…

【Python百日进阶-Web开发-Peewee】Day296 - 查询示例(五)聚合2、递归

文章目录 14.6.13 列出每个指定设施的预订总小时数 List the total hours booked per named facility14.6.14 列出每位会员在 2012 年 9 月 1 日之后的首次预订 List each member’s first booking after September 1st 201214.6.15 生成成员名称列表,每行包含成员总数 Produc…

闲话银行家舍入法,以及在程序中如何实现

前言 相信对于四舍五入的舍入法&#xff0c;大家都耳熟能详&#xff0c;但对于银行家舍入法&#xff0c;可能就会比较少接触了&#xff01; 可是在金融界&#xff0c;银行家舍入法可是大名鼎鼎的主角之一&#xff0c;主要应用于金融领域和涉及货币计算的场合。 那么&#xf…

异步轮询 Web API 的实现与 C# 示例

在现代软件开发中&#xff0c;异步轮询 Web API 是一种常见的做法&#xff0c;尤其是在需要定期从服务器获取数据更新的场景下。C# 作为一种功能强大的编程语言&#xff0c;提供了丰富的异步编程支持&#xff0c;使得实现异步轮询变得相对简单。本文将介绍如何使用 C# 快速实现…

Google Guava Cache简介

目录 简介和Redis的区别 简介 Google Guava 是一个开源的 Java 库&#xff0c;其中提供了一系列强大的工具来简化 Java 开发工作。其中&#xff0c;Guava Cache 组件提供了一个内存缓存的实现&#xff0c;可以显著提高应用程序的性能。这是一个高效且灵活的缓存解决方案&#…

conda 创建新的虚拟环境报错

conda 创建新的虚拟环境报错 CorruptedEnvironmentError: The target environment has been corrupted. Corrupted environments most commonly occur when the conda process is force-terminated while in an unlink-link transaction. 把错误的文件删除如A.json 再重新运行…

JavaWeb-js(4)

js事件 在前端页面中&#xff0c;js程序大多数是由事件来驱动的&#xff0c;当触发某些事件的时候&#xff0c;可以使用js负责响应。 js事件由三部分组成: 事件源——》指的是被触发的对象; 事件类型——》如何触发的事件&#xff0c;如:鼠标单击、双击、键盘操作等;…

钓鱼网站制作-克隆163企业邮箱

这里克隆163企业邮箱比较费劲&#xff0c;和之前的还不一样&#xff0c;这个克隆的目录比较多&#xff0c;发现好多工具都克隆不全&#xff0c;要不就是缺少图片要不就是缺少功能 首先效果 可以看到成功记录账户密码&#xff0c;接下来再来伪装到域名 这里克隆网站使用神器 …

stm32使用单通道规则组ADC

Driver_ADC.c 如果需要关闭adc转换&#xff0c;只需要设置CNT&#xff0c;将其置为0&#xff0c;后面再转换一次就停止了。 #include "Driver_ADC.h"void Driver_ADC1_Init(void) {/* 1. 时钟配置 *//* 1.1 adc时钟 */RCC->APB2ENR | RCC_APB2ENR_ADC1EN;RCC-&g…

bev 之 fastBEV

前面我们提到bev 之 LSS, 知道视觉的BEV方案的主要痛点在于: 1、depth 的预测 2、图像特征到BEV特征之间的视图变换消耗大量计算 LSS 为什么需要D维深度 占据大量消耗的原因是LSS 对每个图像特征点引入深度D&#xff0c;即假设每个像素上存在可能的D维深度。也就是假设不同像…

ubuntu18虚拟机克隆后不能上网和磁盘损坏问题

小学期直接给学弟学妹们自己配好的克隆的虚拟机&#xff0c;结果出现了这两种问题&#xff0c;参考了网上好多资料&#xff0c;太多了忘了存了&#xff0c;花了好久的时间才解决&#xff0c;这里记录一下。 磁盘损坏问题&#xff1a; 网络无法连同问题&#xff0c;ip addr发现…