【STL】 string类使用一站式攻略

这篇具有很好参考价值的文章主要介绍了【STL】 string类使用一站式攻略。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一,STL

1. 简介

2. STL的版本

3. STL 六大组件  

4.  学习STL, 三境界

5. 学会查看C++文档 

二, string类

1. 相对于C语言,我们为什么还需要学习C++的string?

2. 头文件

3.  常见构造函数

4.  operator=   

5.  operator[]  &&  at函数

6. string容量方面

1. 关于  size 与 length  的选择

2. 关于string类 的扩容机制

3.  设置容量

7. iterators——迭代器(重要)

1. 回望 C++入门的 范围 for (语法糖  for)

2. 反向迭代

8. 字符串插入

1. 常见的插入方式:

2. 关于中间插入 insert的使用 

9. 删除字符串——erase

10.  c_str

1. 使用场景

 2. ‘\0’在 C语言  &  C++string类中的区别

11. find & rfind

1.获取文件名后缀

 2. 分离网址

12. getline

13. 字符串 互相转化  其他数据(C++11)

关于string类使用总结

结语


一,STL

1. 简介

STL(standard template libaray-标准模板库):C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架

2. STL的版本

原始版本
Alexander Stepanov Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本 -- 所有 STL 实现版本的始祖。
P. J. 版本
P. J. Plauger 开发,继承自 HP 版本,被 Windows Visual C++ 采用,不能公开或修改,缺陷:可读性比较低,
符号命名比较怪异。
RW 版本
Rouge Wage 公司开发,继承自 HP 版本,被 C+ + Builder 采用,不能公开或修改,可读性一般。
SGI 版本
Silicon Graphics Computer Systems Inc 公司开发,继承自 HP 版 本。被 GCC(Linux) 采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。 我们后面学习STL要阅读部分源代码,主要参考的就是这个版本

3. STL 六大组件  

【STL】 string类使用一站式攻略

4.  学习STL, 三境界

1. 熟练使用 STL。

2. 能够比较清晰的认识STL的底层原理。

3. 能够编写STL的扩展。(在校期间,少数能掌握)

5. 学会查看C++文档 

  Reference - C++ Reference (cplusplus.com)

学习中光string类就有100来个接口,我们熟练掌握常见20个,其余80来个需要我们查找文档,而最好的方式是查看英文原文档。 

二, string类

1. 相对于C语言,我们为什么还需要学习C++的string?

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会 越界访问

2. 头文件

 使用string类时,必须包含头文件以及using namespace std;

#include <string>

3.  常见构造函数

 常见的string类构造函数及功能:

1.      string() (重点)                              构造空的string类对象,即空字符串
2.      string(const char* s) (重点)       用C-string来构造string类对象
3.      string(size_t n, char c)                   string类对象中包含n个字符c
4.      string(const string&s  ) (重点)     拷贝构造 函数

这是原文:

选择 constructor (函数)进入: 

【STL】 string类使用一站式攻略

即可见 

【STL】 string类使用一站式攻略

建议:尝试去阅读原文档,对函数功能的解释。

同时,从查看文档可知,string类  重载了  流提取 & 流插入, 我们直接cout , cin
【STL】 string类使用一站式攻略

演示如下:

int main()
{
	// string(const char* s) (重点)  用string来构造string类对象
	string s1("hello, C++");
	cout << "s1 :" << s1 << endl;

	// string() (重点)  构造空的string类对象,即空字符串
	string s2;
	cout << "s2 :" << s2;
	cin >> s2;
	cout << "s2 :" << s2 << endl;

	// string(const string & s) (重点) 拷贝构造函数
	string s3(s1);
	cout << "s3 :" << s3 << endl;

	// string(size_t n, char c)   string类对象中包含n个字符c
	string s4(4, 'c');
	cout << "s4 :" << s4 << endl;
	
	return 0;
}

这里单独对第三个函数 子链函数  进行解释:

【STL】 string类使用一站式攻略

4.  operator=   

 成员函数:

【STL】 string类使用一站式攻略

 功能展示:

int main()
{
	string s2;
	// string & operator= (const char* s);
	string s1 = "hello, C++"; // 构造 + 拷贝 -> 优化为一次构造
	cout << "s1: " << s1 << endl; // 结果: hello, C++

	// string& operator= (const string & str); 
	s2 = s1;
	cout << "s2: " << s2 << endl; // 结果: hello, C++
	
	// string& operator= (char c);
	s2 = 'x';
	cout << "s2: " << s2 << endl; // 结果: x

	return 0;
}

补充: assign 函数 跟赋值差不多,感兴趣可以去查查文档,这里不进行举出。

5.  operator[]  &&  at函数

功能描述: 两者都是使string类像数组一样的访问字符串。

成员函数:

 【STL】 string类使用一站式攻略

【STL】 string类使用一站式攻略

区别在返回值 

operator[]  在越界时会发生 断言 ;at 访问越界则 返回 异常

功能展示: 

int main()
{   
	// 1. char& operator[] (size_t pos); // 返回可修改的别名
	string s1 = "hello, C++";
	cout << s1[4] << endl;  // at :  s1.at(4)
	s1[4] = 'k';  // 如果类对象实例化时,未被const修饰,同时也具有修改的能力

	// 2. const char& operator[] (size_t pos) const;
	const string s2 = s1;
	cout << s2[4] << endl;
	s2[4] = 'o'; // s2 被const修饰,不允许修改其内容

	return 0;
}

 6. string容量方面

1. 关于  size 与 length  的选择

两者功能都是获取容器中字符串长度

【STL】 string类使用一站式攻略

 一般推荐使用 size() ,因为 length出道比较早,size是后期出道,string类中使用 size 比较多。(注意: max_size 这个没什么意义,返回的都是41亿)

简单遍历输出一遍字符串:

int main()
{   
	string s1 = "hello, C++";
	for (int i = 0; i < s1.size() ; i++)
	{
		cout << s1[i];  // at: s1.at(i);
	}
	return 0;
}

2. 关于string类 的扩容机制

结论: 在不同编译器下扩容机制可能不同,有的是1.5倍,而有的是2倍的扩容。(STL标准库,只是一种标准,不同的编译器厂商有着自己的功能实现方法)

这里用同一段代码在 linux g++和 VS2019 下 扩容的结果:

 【STL】 string类使用一站式攻略

3.  设置容量

我们知道频繁扩容,会有额外的消耗,于是我们预先设定一定大小的容量,减少扩容次数。

函数:

【STL】 string类使用一站式攻略

简单使用:

    s1.reserve(1000); // 单纯开空间

	s2.resize(1000);  // 开空间, 同时设置字符,默认为‘0’
	s2.resize(1000, 'c');

7. iterators——迭代器(重要)

迭代器是string 中的内部类类型,功能跟 operator[]差不多,像数组一样的访问数据。但字符串底层是数组,是一段连续的空间,用operator[] 会比较便利。后面我们学习 STL的vector(顺序表), list(链表)后,我们会发现,operator[]在连续存储的数据结构访问还行,但链表,树,迭代器更合适,而且他们用法类似,因此我们同时学习迭代器。(迭代器是容器通用访问方式,用法类似,提前上路

【STL】 string类使用一站式攻略

简单用法:

int main()
{
   string s1 = "hello, C++";
	string::iterator it = s1.begin();
	while (it != s1.end()) // != 原因:1. string类本身有关 2.其他容器也是用 != 这样设计统一了 
	{
		cout << *it;
		it++;
	}
	return 0;
}

s1.begin() 和  s1.end() 返回迭代器的位置是   [左闭区间 右开区间)  

【STL】 string类使用一站式攻略

1. 回望 C++入门的 范围 for (语法糖  for)

 int main()
{   
    string s1 = "hello, C++";
	for ( auto e : s1) // 自动++, 自动判断结束
	{
		cout << e;
	}
return 0;
}

语法糖  底层是通过 迭代器实现,且只能正向遍历。

2. 反向迭代

功能:反向遍历数据

【STL】 string类使用一站式攻略

 简单用法:

int main()
{
    string s1 = "hello, C++";
	string::reverse_iterator it = s1.rbegin(); 
	while ( it != s1.rend())
	{
		cout << *it;
		it++; // 底层肯定是反向++
	}
  return 0;
}

当然 不管是 s1.begin ,s1.end; s1.rbegin, s2.rend都有返回 const 修饰迭代器重载函数(一般发生在 传string引用时,如: const string& s1)

【STL】 string类使用一站式攻略

8. 字符串插入

C语言中,库函数strcat 也有这样的功能,但没有C++这么智能,C语言劣势:

  • 1. 每次插入字符,字符串需要遍历整个字符串,效率低,且需要保证被插入的字符数组足够大
  • 2. C++的插入会记录末尾字符下标,可以做到直接插入。

1. 常见的插入方式:

1. push_back

2. append

3. operator += 

【STL】 string类使用一站式攻略

详细查文档

简答操作:

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s1("hello, C++");
	s1.push_back('6');
	s1.push_back('-');
	s1.push_back('-');
	cout << s1 << endl;

	s1.append("5");
	cout << s1 << endl;

	string s2(s1);
	s2 += s1;
	s2 += 'c';
	s2 += "你好";
	cout << s2 << endl;
	return 0;
}

2. 关于中间插入 insert的使用 

结论: 尽量少用,string类,insert 中间插入,会导致后面字符挪位,假设要头插入n个字符,第2次,挪一次; 第3次,挪2次;第n次,挪 n - 1次;所以挪位时间复杂度n2了,所以尽量少用。

常见的三个insert 的使用:

【STL】 string类使用一站式攻略

运用如下:

int main()
{
	// 1. 迭代器
	string s1 = "hello, C++";
	string::iterator it = s1.begin() + 2; // 也就是在下标为2的位置插入
	s1.insert(it, 'Z');
	cout << s1 << endl; // heZllo, C++


	string s2 = s1;
	s2.insert(2, "你好"); // 下标为2的位置
	cout << s2 << endl;

	string s3 = s1;
	s3.insert(5, s2);    // 下标为5的位置插入
	cout << s3 << endl;
	return 0;
}

9. 删除字符串——erase

 函数: erase

【STL】 string类使用一站式攻略

代码实践: 

int main()
{
	// 1. 迭代器
	string s1 = "hello, C++";
	string::iterator it = s1.begin() + 2; // 也就是在下标为2的位置插入
	s1.insert(it, 'Z');
	cout << s1 << endl; // heZllo, C++


	string s2 = s1;
	s2.insert(2, "你好"); // 下标为2的位置
	cout << s2 << endl;

	string s3 = s1;
	s3.insert(5, s2);    // 下标为5的位置插入
	cout << s3 << endl;

	// 1. 迭代器删除
	//s3.erase(2);
	string::iterator it2 = s3.begin() + 2;
	string::iterator it3 = s3.end();
	s3.erase(it2, it3);
	cout << s3 << endl;
	return 0;
}

10.  c_str

1. 使用场景

在一些需要用到C语言接口时,C语言不支持C++的string类,而c_str 成员函数可以将string类字符串转化为C语言兼容的字符串

如:用C语言访问文件夹

    string s1("Test.cpp");
	const char* file = s1.c_str();
	FILE* myfile = fopen( file, "r"); // 不认string类
	char i = fgetc(myfile);
	while ( i != EOF)
	{
		cout << i;
		i = fgetc(myfile);
	}

 2. ‘\0’在 C语言  &  C++string类中的区别

结论: 

C语言比较重要:  ‘\0’在C语言中,像strcopy, strcat等等字符串接口函数结束大多有 '\0' 作为字符串结尾

C++直接无视: 我们可以将字符串中间任意位置设置为\0,但是在C++中字符串会将\0当成一个正常字符处理打印时会当成空格或者不占位置的字符输出

int main()
{
	string s1("test.cpp");
	s1 += '\0';
	s1 += '\0';
	s1 += '\0';
	s1 += '\0';
	s1 += "test.cpp";
	cout << s1.c_str() << endl; // ‘\0’对于C语言,是字符串结束的标志
	cout << s1 << endl;         //   而在string中,字符串中可以存在,但不发生显示或者是空格。
	
	return 0;
}

11. find & rfind

【STL】 string类使用一站式攻略

pos: 开始查找的字符位

n:   匹配的字符序列的长度

1.获取文件名后缀

int main()
{   // 1. 简单文件获取后缀
	string s1("test.cpp");
	size_t i = s1.find('.');
	string tmp;
	if (i != string::npos)
	{
		tmp = s1.substr(i); // 先用获取子串函数
	}
	cout << tmp << endl;

	// 2. 复杂后缀,而只取最后的后缀
	string s2("test.cpp.tar.zip");
	size_t i2 = s2.rfind('.');  // 从后向前寻找
	string tmp2;
	if (i2 != string::npos)
	{
		tmp2 = s2.substr(i2);
	}
	cout << tmp2;
	return 0;
}

 补充一下substr:

【STL】 string类使用一站式攻略

 2. 分离网址

int main()
{
	string s1("https://mp.csdn.net/mp_blog/creation/editor/131103529");
	// 1. 协议
	size_t pl = s1.find("://");
	size_t next = pl;
	string protocol = s1.substr(0, pl);
	cout << protocol << endl;
	// 2. 域名
	size_t p2 = s1.find("/", next += 3);
	string rn = s1.substr(next, p2 - next);
	next = p2;
	cout << rn << endl;

	// 3. 资源名
	string way = s1.substr(next);
	cout << way << endl;
	return 0;
}

12. getline

 功能:用于从输入流中读取一行数据,并存储到string对象中。

【STL】 string类使用一站式攻略

is:输入流对象。

str:用于存储读取的数据的string对象。

delim:可选参数,表示行结束符,默认为'\n'。(没有空格作为结束符)

 比如牛客这道题:

字符串最后一个单词的长度_牛客题霸_牛客网 (nowcoder.com)

13. 字符串 互相转化  其他数据(C++11)

【STL】 string类使用一站式攻略

这个感兴趣可以一个个试。举一个栗子:

stoul :  字符串  转  无符号长整型 

关于string类使用总结

   1. 学会查文档!!!(重要

   2. 可以问chatgpt

   3. 多练则会

结语

本小节就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区评论;如果给小伙伴带来一些收获请留下你的小赞,你的点赞和关注将会成为博主创作的动力。文章来源地址https://www.toymoban.com/news/detail-492814.html

到了这里,关于【STL】 string类使用一站式攻略的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • API 参考与帮助内容:一站式开发与使用者支援

    API 文档是旨在了解 API 详细信息的综合指南。通常,它们包括端点、请求示例、响应类别和示例以及错误代码等信息。API 文档可帮助开发人员了解 API 端点的具体细节,并了解如何将 API 成功集成到他们的软件中。 API 文档生成工具是直接从源代码创建 API 文档的软件应用程序

    2024年02月04日
    浏览(51)
  • 教你使用 Linux+MeterSphere 一站式开源持续测试平台远程访问

    MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能,全面兼容 JMeter、Selenium 等主流开源标准,有效助力开发和测试团队充分利用云弹性进行高度可扩展的自动化测试,加速高质量的软件交付,推动中国测试行业整体效率的提升。 下面介

    2024年02月09日
    浏览(53)
  • datahub元数据管理平台从安装到使用一站式指南(未完)

    目录 一 datahub安装 1.1 datahub在线安装 1.1.1 docker在线安装 1.1.2 python在线安装 1.1.3 datahub在线安装并启动 1.2 datahub离线安装 1.2.1 docker离线安装 1.2.2 python离线安装 1.2.3 datahub离线安装并启动 1.3 本地环境替换datahub docker 1.3 安装过程中可能遇到的问题 1.3.1 python3安装后导致yum不能正常

    2024年02月06日
    浏览(69)
  • ChatGPT4 的体验 一站式 AI工具箱 -—Poe(使用教程)

    界面介绍: 是一个基于机器学习的聊天机器人,能够识别自然语言并做出智能回答。Sage通过自然语言处理和对话管理技术来实现对话的自然流畅和个性化,同时支持多种语言。Sage较为擅长语言相关的工作,例如创作文章,做摘要等。 是由开放人工智能(OpenAI)公司开发的一

    2023年04月22日
    浏览(48)
  • ChatGP4 的体验 一站式 AI工具箱 -—Poe(使用教程)

    界面介绍: 是一个基于机器学习的聊天机器人,能够识别自然语言并做出智能回答。Sage通过自然语言处理和对话管理技术来实现对话的自然流畅和个性化,同时支持多种语言。Sage较为擅长语言相关的工作,例如创作文章,做摘要等。 是由开放人工智能(OpenAI)公司开发的一

    2024年02月11日
    浏览(106)
  • 中东 Shopify 如何使用 Bytebase 构建一站式数据库开发工作流

    Salla 是一家 2016 年成立,位于沙特麦加的自建站电商平台。 作为中东 Shopify,其最大的特点是支持阿拉伯语建站,并且提供更多适应中东地区特点的本地化服务。截止目前,已有 47,000 家店铺入驻 Salla,商品销售总额达到了 43 亿美元,近三年保持了接近 100% 的增速。 与 Sall

    2024年02月09日
    浏览(49)
  • H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档)

    注意:可以直接移步至【2. H2数据库实战】目录下进行对H2数据库的快速使用 1.1 H2数据库介绍 官方文档地址: http://www.h2database.com/html/main.html H2的开发始于2004年5月, 但它在2005年12月14日首次发表。 H2的原作者Thomas Mueller也是Hypersonic SQL的原始开发者。 2001年,他加入PointBase公司

    2024年02月13日
    浏览(44)
  • 如何使用Docker部署Nacos服务?Nacos Docker 快速部署指南: 一站式部署与配置教程

    🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页 ——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础

    2024年02月09日
    浏览(84)
  • Maven安装与配置教程(0基础超详细,最新阿里云镜像),并在IDEA使用maven一站式解决

                    目前的最新版本为3.9.5,本文以3.9.1为例,大家自行选择版本 最好建立一个文件夹专门存放Maven相关文件,方便现在和以后进行操作和管理 我的路径地址为:D:JAVAMavenapache-maven-3.9.1-binapache-maven-3.9.1 (这个随意但是要记住) (首先先确定你的java环境已经配

    2024年02月03日
    浏览(52)
  • 一站式图片管理

    一、引言 随着智能手机、社交媒体和网络技术的快速发展,人们在生活中产生了越来越多的图片。据统计,到2025年,全球图片市场规模将达到6000亿美元。面对如此庞大的数据量,如何进行高效、便捷的图片管理成为了一个亟待解决的问题。本文将详细介绍一站式图片管理方

    2024年01月20日
    浏览(62)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包