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

news2024/11/15 10:28:21


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

🔥个人主页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函数可以搜索字符串中的内容,是处理字符串时常用的功能之一

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

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

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

相关文章

Java | 增强for底层工作机制

✍&#x1f3fc;作者&#xff1a;周棋洛&#xff0c;bilidown开发者。 ♉星座&#xff1a;金牛座 &#x1f3e0;主页&#xff1a;我的个人网站 &#x1f310;关键&#xff1a;Java 增强for 工作机制 目录 引言增强for循环语法增强for工作机制探究简单总结1.对于实现了Iterable接…

LeetCode算法题:11. 盛最多水的容器(Java)(双指针问题总结)

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 提示&#xff1a; n height.length2 <…

寻求发展+兼顾陪读|企业高管赴美国乔治梅森大学做访问学者

E经理拟去美国访学&#xff0c;想达到3个目的&#xff1a;结合本专业方向&#xff0c;扩展至跨学科研究领域&#xff1b;考察市场&#xff0c;寻求新的发展契机&#xff1b;携孩子出国读书&#xff0c;兼顾陪读&#xff0c;并希望尽早出国。最终我们为其落实的乔治梅森大学访问…

AI预测体彩排3采取878定位大底=23策略+杀断组+杀组选+杀和尾+杀和值012缩水测试5月15日预测第1弹

昨天与一位玩排3的彩友通过视频直播的形式聊了下&#xff0c;受益匪浅&#xff0c;给我提供了一些比较有价值的建议&#xff0c;比如&#xff0c;对于878的定位策略&#xff0c;方向是没问题的&#xff0c;但是8783的话&#xff0c;还是缺乏一定的命中率&#xff0c;如果87823&…

做私域,该如何从公域向私域引流?

说到私域运营&#xff0c;很多人首先就会想到&#xff1a;私域流量。企业做私域&#xff0c;流量从哪来&#xff1f;该怎样去引流&#xff1f;又该如何保障私域流量的质量等一系列问题&#xff0c;都需要企业一一解决。所以&#xff0c;今天&#xff0c;我们就来探讨一下&#…

transformer通俗理解

transformer中最麻烦的encoder模块其实张量和矩阵的变化维度比较复杂。我感觉这篇文章讲的特别详细Q、K、V 与 Multi-Head Attention 多头注意力机制 - 知乎 我总结一下文章几个很重要的点吧&#xff01;算是我学的一点收获 1.什么是QKV&#xff1f; 2.怎么理解多头&#xff…

端口号查询进程PID

情况1&#xff1a;由于 idea 突然闪退&#xff0c;导致正在 debug 的 Java 进程没结束掉&#xff0c;端口还在占用&#xff0c;重新 debug 不了&#xff0c;所以需要到任务管理器把进程结束掉 但问题是如果当任务管理器进程同时有多个 Java 进程在运行&#xff08;而且名字一样…

万物皆可监控(shell脚本监控TIDB-DM和DSG同步状态)

监控的方式有很多&#xff0c;常用的有zabbix和prometheus平台&#xff0c;理论上都可以做到对有状态服务的监控&#xff0c;因为我个人对这两个监控平台不是很熟悉&#xff0c;所以一般喜欢使用shell脚本来做监控&#xff1b; 纯oracle 数据库的监控推荐使用EMCC&#xff0c;…

基于火山引擎云搜索的混合搜索实战

在搜索应用中&#xff0c;传统的 Keyword Search 一直是主要的搜索方法&#xff0c;它适合精确匹配查询的场景&#xff0c;能够提供低延迟和良好的结果可解释性&#xff0c;但是 Keyword Search 并没有考虑上下文信息&#xff0c;可能产生不相关的结果。最近几年&#xff0c;基…

淘系淘宝订单详情api接口(订单详情,订单列表,出售中,库存等属性)

淘系淘宝订单详情api接口&#xff08;订单详情&#xff0c;订单列表&#xff0c;出售中&#xff0c;库存等属性&#xff09;

免费泛域名证书申请

通配符证书是一种 SSL/TLS 证书&#xff0c;可用于保护多个域&#xff08;主机&#xff09;&#xff0c;由域名字段中的通配符 (*) 指示。 如果您有很多需要保护的域或子域&#xff0c;这会很有帮助&#xff0c;因为它可以节省您的时间和金钱。 本文将讨论通配符证书、它们的工…

【Win】如何在Windows隐藏安装的程序

由于维护人员或用户可能无意中通过“程序和功能”选项删除对业务至关重要的软件&#xff0c;这导致服务中断或安全风险。为了防止此类情况发生&#xff0c;确保只有授权的用户才能访问和管理系统中的程序。为了实现这一目标&#xff0c;我们将探讨如何在Windows操作系统中隐藏特…

使用高防IP是应对网络安全的重要措施

使用高防IP&#xff08;High Defense IP&#xff09;在现代网络环境中显得尤为重要&#xff0c;这主要源于以下几个方面的原因&#xff1a; 一、网络安全形势严峻 随着互联网的快速发展&#xff0c;网络安全问题日益突出。各种网络攻击手段层出不穷&#xff0c;如分布式拒绝服…

R语言基础--文件读写

From生物技能树&#xff08;R第五节&#xff09; 文章目录 一、文件读写1.注意用project管理工作目录2、文件读取1、读取.txt文件2、读取.csv文件注意&#xff1a;数据框不允许重复的行名 3.数据框的导出4.读取文件的其他方式(用于读取/导出文件的R包)--经验1.base2.readr3.dat…

【会议征稿】2024年机器人前沿技术与创新国际会议(FTIR 2024, 7/19-21)

2024年机器人前沿技术与创新国际会议&#xff08;FTIR 2024&#xff09;将于2024年7月19-21日在中国杭州举行。FTIR 2024聚焦前沿技术与创新&#xff0c;将把机器人领域的创新学者和专家聚集到一个共同的论坛。会议的主要目标是促进机器人的研究和开发活动&#xff0c;另一个目…

使用单目相机前后帧特征点匹配进行3D深度估计的方法

在计算机视觉和机器人领域&#xff0c;三维空间感知是实现环境理解和交互的核心技术之一。特别是在资源受限的场合&#xff0c;使用针孔模型的单目相机进行深度估计成为了一种既经济又实用的解决方案。单目深度估计技术依赖于从连续视频帧中提取和匹配特征点&#xff0c;以估计…

企业大模型如何成为自己数据的“百科全书”?

作者 | 郭炜 编辑 | Debra Chen 在当今的商业环境中&#xff0c;大数据的管理和应用已经成为企业决策和运营的核心组成部分。然而&#xff0c;随着数据量的爆炸性增长&#xff0c;如何有效利用这些数据成为了一个普遍的挑战。 本文将探讨大数据架构、大模型的集成&#xff0…

线上网页点击菜单没有反应 报错ChunkLoadError:Loading chunk chunk-***** failed

现象 点击菜单无反应并且控制台报错Loading chunk chunk-***** failed 具体错误现象截图如下 分析 在线上页面已经打开的情况下&#xff0c;重新打包部署了前端项目。每次打包&#xff0c;js文件的hash值都会发生改变&#xff0c;因为我们的路由采用了懒加载&#xff0c;未…

吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.7

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周&#xff1a;优化算法 (Optimization algorithms)2.7 RMSprop 第二门课: 改善深层神经网络&am…

代码复现|Demucs Music Source Separation

一、背景介绍 Demucs是一个开源的音源分离项目。 Demucs在算法层面前后经历了三次大版本的进化&#xff0c;最原始的V1版本是&#xff1a;编解码LSTM。具体算法原理图如下所示。该版本在时域进行音源分离。关于阅读笔记请点击这篇文章。 V1版本原理图 V2版本是同时使用时域和频…