我与C++的爱恋:string类的常见接口函数


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

🔥个人主页guoguoqiang. 🔥专栏我与C++的爱恋

Alt

朋友们大家好啊,本节我们来到STL内容的第一部分:string类接口函数的介绍


1.string类的认识

给大家分享一个c++文档

https://legacy.cplusplus.com/

在这里插入图片描述

  1. 字符串 string 是表示字符序列的类
  2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作
    单字节字符字符串的设计特性。
  3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信
    息,请参阅basic_string)。
  4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits
    和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。
  5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个
    类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。
    总结:
  6. string是表示字符串的字符串类
  7. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  8. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
  9. 不能操作多字节或者变长字符的序列。
    在使用string类时,必须包含#include头文件以及using namespace std;

2.常见接口讲解

2.1 string类对象的常见构造

在这里插入图片描述
在这里插入图片描述

string() 这个函数的功能是构建一个空字符串,也是默认构造。
string(const char*s) 用c—str来构造string类对象
用法:string s1("hello world");
string(const string&s) 拷贝构造函数
用法:
string s1("hello world"); string s2(s1);
`
string (const string& str, size_t pos, size_t len= npos);
在这里插入图片描述
拷贝从pos位置开始,向后len长度,如果超过剩余长度,则遍历到字符串的末尾

注意,这里有个npos的缺省值,如果不给值,默认给npos,会遍历到字符串末尾。
了解一下npos
在这里插入图片描述

npos是一个无符号常量整数-1,无符号整数-1即为整形的最大值2^32-1
用法:

string s1("hello world");
string s3(s1, 5, 3);
string s4(s1, 5, 10);
string s5(s1, 5);
cout << s1 << endl;
cout << s3 << endl;
cout << s4 << endl;
cout << s5 << endl;

输出结果:

hello world
 wo
 world
 world

string(const char*s,size_t n);
在这里插入图片描述
函数的功能是拷贝字符串的前n个字符
在这里插入图片描述
string(size_t n,char c);
在这里插入图片描述
这个函数的功能就是用n个字符c来构造字符串,用法:
在这里插入图片描述

2.2 对string对象的遍历和修改

对于string遍历使用[]遍历最为方便
在这里插入图片描述
函数的功能是返回pos位置的字符

int main() {
	string s1("hello world");
	for (int i = 0; i < s1.size(); i++) {
		cout << s1[i] << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述
字符串长度通过s.size()来表示。
operator[]是一个重载的操作符,用于直接访问和修改字符串中特定索引位置的字符
char& operator[] (size_t pos);
返回的为引用,意味着我们还可以对这个位置进行修改。
例如:

int main() {
	string s1("hello world");
	for (int i = 0; i < s1.size(); i++) {
		s1[i]++;
		cout << s1[i] << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述
这里我们发现还有第二种重载方式:

const char& operator[] (size_t pos) const;

const定义的对象是只读的,不能对其进行修改

迭代器iterators
在这里插入图片描述
迭代器的作用是用来访问容器(用来保存元素的数据结构)中的元素,所以使用迭代器,我们就可以访问容器中里面的元素。这和访问数组这个序列的指针一样,因为数组范围内的指针就是迭代器的一种。

int main() {
	string s1("hello world");
	string::iterator it1 = s1.begin();
	while (it1 != s1.end()) {
		cout << *it1 << " ";
		++it1;
	}
	cout << endl;
	return 0;
}

在这里插入图片描述
在这里插入图片描述
begin作用是返回第一个有效位置的迭代器,end是返回最后一个元素的下一个位置,也就是/0的位置。

在这里插入图片描述

虽然我们习惯使用下标来访问,但是有时候只能只能使用迭代器来访问(迭代器的访问范围更广泛),比如后面的list部分。所以迭代器才是最重要的方式。

反向迭代器
在这里插入图片描述
它返回的是字符串末尾的迭代器,我们用这一组迭代器可以实现逆序遍历
在这里插入图片描述
在这里插入图片描述

int main() {
	string s1("hello world");
	string::reverse_iterator it1 = s1.rbegin();
	while (it1 != s1.rend()) {
		cout << *it1 << " ";
		++it1;
	}
	cout << endl;
	return 0;
}

还有const版本

const_iterator begin() const;
int main() {
	string s1("hello world");
	string::const_iterator it1 = s1.begin();
	while (it1 != s1.end()) {
		//(*it1)++;    //如果修改会编译报错
		cout << *it1 << " ";
		++it1;
	}
	cout<<endl;
	return 0;
}

对const字符串进行遍历,const_iterator是只读的,不可写
在这里插入图片描述
范围for

string s1("hello world");
for (auto e : s1)
{
	cout << e << " ";
}
cout << endl;

范围for本质就是迭代器

2.3 string类对象的容量操作

在这里插入图片描述
size
size的功能是返回字符串长度
在这里插入图片描述
capacity

在这里插入图片描述

void func2()
{
	string s;
	size_t sz = s.capacity();
	cout << sz << endl;
	for (int i = 0; i < 100; i++)
	{
		s.push_back('a');
		if (sz != s.capacity())
		{
			sz = s.capacity();
			cout << "容量:" << sz << endl;
		}
	}
}

通过上述函数来看一下它的扩容机制
在这里插入图片描述
我们发现第一次是以2倍扩容,后面都是1.5倍扩容。

clear
clear作用是清空有效字符,但它对capacity没有影响

void func3() {
	string s("hello world");
	size_t sz = s.capacity();
	cout << s << endl;
	cout << sz << endl;
	s.clear();
	cout << s << endl;
	cout << s.capacity() << endl;

}

在这里插入图片描述
empty
检测字符串释放为空串,是返回true,否则返回false
reserve
reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。
当你知道将要在字符串中存储具体数量的字符时,使用reserve可以减少因反复增加字符串大小而导致的多次内存分配和数据复制,从而提高性能。(提前开好,减少扩容,提高效率)
扩容可能会开辟新的空间,使用reserve我们就可以减少扩容

string s;
s.reserve(100);
cout << s.capacity() << endl;

在这里插入图片描述
reserve的调用是一个请求,所以他申请的空间可能大于你要的空间,但不会小于。(g++中是刚好等于你要的空间)
在这里插入图片描述
reserve不会进行缩容,比当前capacity大才会进行扩容

resize
在这里插入图片描述
resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。
注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
如果个数不变,resize不会对字符串进行任何修改。

void func5() {
	string str("hello");
	str.resize(10, 'x');//结果  helloxxxxx
	str.resize(2);  //结果  he
	str.resize(5);  //结果  hello
	cout << str << endl;
}

resize直接修改字符串本身,如果你增长字符串并且不指定填充字符则填充空字符’\0’ ,如果减小字符串长度,被移除的字符就被丢弃,而且无法恢复。

2.4 string类对象的修改操作

push_back
在字符串后面尾插字符

string s("abcdef");
s.push_back('e');
cout<<s<<endl;//abcdefe

append
在字符串后追加一个字符串

void test_string10() {
	string s("hell");
	s.push_back('o');
	cout << s << endl;
	s.append("world");
	cout << s << endl;
}

在这里插入图片描述
在这里插入图片描述
append也可以插入string,或者插入string的部分。还可以插入n个字符

void test_string11() {
	string s("hell");
	string s1("o world!");
	s.append(s1);
	cout << s << endl;
}

在这里插入图片描述

void test_string11() {
	string s("hell");
	string s1("o world!");
	s.append(s1,0,2);
	cout << s << endl;//hello 
}

还可以插入字符串的迭代区间

void test_string12() {
	string s("hell");
	string s1("o world!");
	s.append(s1.begin(),s1.end());
	cout << s << endl;
}

在这里插入图片描述
如果在这里我们不想要感叹号可以这样追加:

void test_string12() {
	string s("hell");
	string s1("o world!");
	s.append(s1.begin(),--s1.end());
	cout << s << endl;
}

在这里插入图片描述
operator+=
在这里插入图片描述
operator+=十分方便,我们可以直接追加一个string对象,或者一个字符串,或者一个字符

insert和erase
在这里插入图片描述

insert可以在指定位置插入数据。

void test_string13() {
	string s("hello");
	s.insert(0, "xxx");
	cout << s << endl;
}

在这里插入图片描述
erase
在这里插入图片描述
从pos位置开始删除,这里pos给的缺省值,如果不传参,则全部删除,len的缺省值为npos,如果len大于剩余字符长度(_size-pos),也会全部删除掉
replace
在这里插入图片描述
对string对象内容进行替换

void test_string14() {
	string s("hello  ");
	s.replace(6,1, "world");//把下标为6的那个字符修改为world字符串
	cout << s << endl;
}

在这里插入图片描述
find
在这里插入图片描述
find用于搜索字符串中第一次出现的指定子字符串或字符的位置。如果找到了指定的子字符串或字符,find会返回它开始的位置的索引;如果没有找到,它会返回一个特殊的常量std::string::npos(这个是无效的位置),表示未找到任何匹配。
find函数的常见用法:

  1. 搜索字符
string str = "Hello, world!";
size_t pos = str.find('w');
if (pos != string::npos) {
		cout << pos << endl;
    // 找到了字符 'W'
}

  1. 搜索子字符串
string str = "Hello, world!";
size_t pos = str.find("world");
if (pos != string::npos) {
    printf("找到了子字符串 \"world\"");
}

  1. 从指定位置开始搜索
string str = "Hello, world! world!";
size_t pos = str.find("world", 8); // 从索引8开始搜索
if (pos != string::npos) {
    printf("找到了第二个 \"world\"");
}

find函数可以搜索字符串中的内容,是处理字符串时常用的功能之一

本节内容到此结束!感谢大家阅读!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详细教程!VMware Workstation Pro16 安装 + 创建 win7 虚拟机!

嚯嚯嚯&#xff0c;很多宝子都想拥有自己不同的操作系统环境&#xff0c;用于学习或项目搭建。买服务器费钱&#xff0c;虚拟机则成为了一个很好的选择。本文详细介绍VMware Workstation Pro 16安装及win7虚拟机创建&#xff0c;保姆级教程奉上&#xff01; 一、准备工作 VMw…

【Android】重写onClick方法时,显示Method does not override method from its supperclass

问题 重写onClick方法时&#xff0c;显示Method does not override method from its supperclass 解决 在类上加implements View.OnClickListener

SC8908电机驱动芯片替代AN41908

SC8908 描述 五路H桥静音驱动电机驱动芯片&#xff0c;闭环直流电机光圈调节&#xff0c;支持霍尔位置检测&#xff0c; 2个步进电机。步进电机驱动带256微步细分。 主要特性 • 步进驱动H桥每路250mA最大驱动电流 • 光圈直流驱动H桥每路150mA最大驱动电流 • 单独…

C# WinForm —— 21 RichTextBox 使用

1. 加载文件到控件中 加载文件时&#xff0c;要设置文件的路径和类型RichTextBoxStreamType&#xff0c;文件类型包含&#xff1a; RichText 0&#xff1a;富文本格式&#xff08;RTF&#xff09;流PlainText 1&#xff1a;纯文本流对象链接和嵌入&#xff08;OLE&#xff…

UE4_环境_局部雾化效果

学习笔记&#xff0c;不喜勿喷&#xff01;侵权立删&#xff01;祝愿大家生活越来越好&#xff01; 本文重点介绍下材质节点SphereMask节点在体积雾中的使用方法。 一、球体遮罩SphereMask材质节点介绍&#xff1a; 球体蒙版&#xff08;SphereMask&#xff09; 表达式根据距…

Win11把应用程序添加到开机自启动中

通过WinR命令打开“运行”&#xff0c;输入shell:startup 进入到如图目录&#xff1a; 将想要自动启动的应用的快捷方式都拷贝进来。 之后在任务管理器中就能发现它了。

使用vcpkg与json文件自动安装项目依赖库

说明 本文记录自己使用vcpkg.json文件自动安装依赖库并完成编译的全过程。 关于vcpkg是什么这里就不多详细解释&#xff0c;可以看一下专门的介绍及安装的文章&#xff0c;总之了解这是一个C的包管理工具就可以了。 流程 下面介绍从GitHub上克隆C项目以及为这个项目安装所需…

python文件操作常用方法(读写txt、xlsx、CSV、和json文件)

引言 用代码做分析的时候经常需要保存中间成果&#xff0c;保存文件格式各不相同&#xff0c;在这里好好总结一下关于python文件操作的方法和注意事项 Python 提供了丰富的文件操作功能&#xff0c;允许我们创建、读取、更新和删除文件。允许程序与外部世界进行交互。 文章目录…

冯喜运:5.15黄金原油晚盘分析:鲍威尔再放鹰,降息悬念重重

【黄金消息面分析】&#xff1a;在全球经济动荡和通胀预期不断上升的背景下&#xff0c;黄金作为传统的避险资产&#xff0c;再次成为投资者关注的焦点。当前&#xff0c;黄金价格交投于2370美元/盎司左右&#xff0c;连续两日日线呈现上涨趋势&#xff0c;而白银价格也在连续三…

二进制搭建k8s

实验环境&#xff1a; k8s集群master01:192.168.1.11 k8s集群master02:192.168.1.22 master虚拟ip&#xff1a;192.168.1.100 k8s集群node01:192.168.1.33 k8s集群node01:192.168.1.44 nginxkeepalive01&#xff08;master&#xff09;:192.168.1.55 nginxkeepalive02&a…

困惑点记录

【第十章 总结思考】CIM之我见 - 知乎

Java开发大厂面试第03讲:线程的状态有哪些?它是如何工作的?

线程&#xff08;Thread&#xff09;是并发编程的基础&#xff0c;也是程序执行的最小单元&#xff0c;它依托进程而存在。一个进程中可以包含多个线程&#xff0c;多线程可以共享一块内存空间和一组系统资源&#xff0c;因此线程之间的切换更加节省资源、更加轻量化&#xff0…

C++11 新特性 常量表达式 constexpr

为了解决常量无法确定的问题&#xff0c;C11在新标准中提出了关键字constexpr&#xff0c;它能够有效地定义常量表达式&#xff0c;并且达到类型安全、可移植、方便库和嵌入式系统开发的目的。 一、常量的不确定性 在C11标准以前&#xff0c;我们没有一种方法能够有效地要求一…

短视频矩阵系统/源码----可视化剪辑技术独家开发

现阶段市面上大多矩阵软件都非常程序化且需要使用者具有较强的逻辑思维能力或剪辑经验&#xff0c;这使得一些个人、团队、企业在使用时无形中增加了学习成本&#xff0c;剪辑出来的效果大多不尽如人意&#xff0c;发出来的视频没有流量&#xff0c;根本达不到预期效果。 如何提…

汽车工厂安灯系统能够快速知晓生产现场的状况

汽车工厂是一个庞大的生产系统&#xff0c;其中有数以百计的工人、机器和设备在不断运转&#xff0c;以确保汽车的生产顺利进行。在如此复杂的生产环境中&#xff0c;安全是至关重要的&#xff0c;而安灯系统正是一个能够帮助汽车工厂快速知晓生产现场状况的重要工具。 安灯系统…

海外云手机的运作原理和适用场景

海外云手机是一种基于云计算技术的虚拟手机服务&#xff0c;通过将手机操作系统和应用程序托管在远程服务器上&#xff0c;实现用户可以通过互联网连接来使用和管理手机功能&#xff0c;而无需实际拥有物理手机。以下是有关海外云手机的相关信息&#xff1a; 海外云手机的运作原…

HCIP【Hybird实验】

目录 一、实验拓扑图&#xff1a; 二、实验要求&#xff1a; 三、实验思路&#xff1a; 四、实验过程&#xff1a; 1、配置PC的IP地址&#xff08;不用配置网关&#xff0c;这个拓扑图没有使用到三层设备&#xff09; 2、交换机配置 3、PC间进行测试&#xff1a; 一、实…

大模型来了,创业者怎么做出好产品?

大模型的问世惊艳了人们的目光&#xff0c;打开了对AI想象力——生成未来&#xff0c;是谁的未来&#xff1f; “电的发明并不是只能让爱迪生的公司成为全球最大公司&#xff0c;而是为众多电器制造商也提供了巨大的商机。从人类科技史的角度来看&#xff0c;应用层面的价值往…

基于国产LoRa的智慧农业解决方案--ASR6601、SX1278

我国《数字乡村发展战略纲要》明确指出“要推进农业数字化转型”&#xff0c;加快推广云计算、大数据、物联网、人工智能在农业生产经营管理中的运用。 然而&#xff0c;目前我国的农业数字化转型还面临着诸多挑战。我国整体农业机械化程度和自动化控制水平仍然较低。由于农田面…

[图解]EA从数据库逆向得到分析类模型-01

1 00:00:00,840 --> 00:00:02,400 今天&#xff0c;我们来说一下 2 00:00:02,670 --> 00:00:06,320 一个最近几天不止一个同学问的问题 3 00:00:06,490 --> 00:00:11,410 就是说&#xff0c;怎样把一个数据库 4 00:00:13,740 --> 00:00:16,720 转到分析类图 5 …