string函数以及string常用接口

news/2025/3/14 6:42:09/

本文介绍的是C++关键字string中一些重要用法,以及各种字符串序列的处理操作
——飘飘何所似,天地一沙鸥
在这里插入图片描述

文章目录

  • 前言
  • 一、string(字符串类)
  • 二、string类对象的容量操作
    • 2.1 size/length
    • 2.2 capacity
    • 2.3 empty/clear
    • 2.4 resize/reserve
  • 三、string类对象的访问及便利操作
    • 3.1 operator[]
    • 3.2 begin+end(迭代器)
    • 3.3 范围for
  • 四、string类对象的修改操作
    • 4.1 operator+=/push_back/append
    • 4.2 c_str
    • 4.3 find/rfind
    • 4.4 substr


前言

string是C++、java、VB等编程语言中的字符串,字符串是一个特殊的对象,属于引用类型。 在java、C#中,String类对象创建后,字符串一旦初始化就不能更改,因为string类中所有字符串都是常量,数据是无法更改,由于string对象的不可变,所以可以共享。对String类的任何改变,都是返回一个新的String类对象。 C++标准库中string类以类型的形式对字符串进行封装,且包含了字符序列的处理操作。


一、string(字符串类)

  1. 字符串是表示字符序列的类。
  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)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。

总结:

  1. string是表示字符串的字符串类。
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名typedefbasic_string<char,char_traits,allocator> string;
  4. 不能操作多字节或者变长字符的序列。在使用string类时,必须包含#include头文件以及using namespace std;

二、string类对象的容量操作

2.1 size/length

size_t size() const;
计算字符串长度类接口

#include<iostream>using namespace std;int main()
{//创建string类型的字符串strstring str = ("hello C++");//计算str大小std::cout << "The size of str is " << str.size() << " bytes.\n";return 0;
}

在这里插入图片描述
length与size并没有什么区别,仅仅只是在STL没有出现时,length就已经存在了,而我们也知道语言的发展一定是向下兼容的它不会去删除原有的东西,只会出现更多的补丁和更加新鲜的东西

#include<iostream>using namespace std;int main()
{string str = ("hello C++");std::cout << "The size of str is " << str.size() << " bytes.\n";std::cout << "The size of str is " << str.length() << " bytes.\n";return 0;
}

在这里插入图片描述

2.2 capacity

size_t capacity() const;
计算string类空间大小

#include<iostream>using namespace std;int main()
{string str = ("hello C++");std::cout << "The size of str is " << str.size() << " bytes.\n";std::cout << str.capacity() << endl;return 0;
}

在这里插入图片描述

2.3 empty/clear

bool empty() const;
检出字符串释放为空串,是则返回ture,否返回false
void clear();
清空字符串但是不会删除该字符串空间
在这里插入图片描述
仅仅只是一个判断string类字符串是否已经置为空。
在这里插入图片描述
S1中内容已经被删空但是我们看到S1所在空间并没有被释放还是在原来的地址,并且可以访问到,存入新的东西。

2.4 resize/reserve

void resize (size_t n);
void resize (size_t n, char c);

将有效字符改为n,并将多余的空间用c填充

void reserve (size_t n = 0);
为字符串预留空间
在这里插入图片描述

先将s的内容改为和s1一致然后对他们分别使用resize/reserve进行扩容,最后分别输出他们的内容和他们所扩容空间的大小。

resize/reserve根本的区别就在于一个对它所开的空间进行初始化而另一个并不会对开的空间进行初始化,还有一点就是当所开空间小于原有空间时他会保留前面n个数据,然年舍弃多余的部分
另外,在进行空间开辟工作时候,最后事先知道空间用量进行提前预留使用reserve会极大的提高时间复杂度

三、string类对象的访问及便利操作

3.1 operator[]

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

返回pos位置的字符,const string类对象调用
不做过多介绍类似于数组的方式来直接获取第pos个数据
在这里插入图片描述

3.2 begin+end(迭代器)

iterator begin();
const_iterator begin() const;

迭代器是string中便利字符串的一种重要工具,具体实现如下
在这里插入图片描述

3.3 范围for

范围for的底层实现就是调用迭代器,在使用的时候借用了关键字auto可以不用定义冗余的类型算是一种很方便的用法不过多介绍,代码如下

for(auto ch:s)
{
cout<<ch<<" ";
ch++;
}
cout<<endl;

四、string类对象的修改操作

4.1 operator+=/push_back/append

string& operator+= (const string& str);
string& operator+= (const char
s);
string& operator+= (char c)
*

最便捷的一种追加方式+=直接在原字符串上进行,可以追加string类/字符串/字符,直接+=
void push_back (char c);
尾插字符c,就是顺序表/链表的那种尾插方式,遍历尾插,不建议用效率很低

在这里插入图片描述
operator+=可以随意的进行字符/字符串/类的追加

append!是坑不作介绍不建议用

4.2 c_str

const char c_str() const;*
c_str()是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址。 换种说法,c_str ()函数返回一个指向正规C字符串的 指针常量 ,内容与本string串相同。
在这里插入图片描述

c_str()返回的是一个临时指针随着原指针指向位置数值的改变

这样看来c_str好像没有实际的意义与用途,其实s_str多用于与其他各种操作一起进行我们只需要了解他的用法就可以,一般不会单独使用来实现什么东西。在进行c_str的使用时尽量在每次都strcpy一下防止丢失。

int main() {char ptr[5];string s = "12345";strcpy(ptr, s.c_str());cout << "s改变前ptr为:" << ptr << endl;s = "66666";cout << "s改变后ptr为:" << ptr << endl;return 0;//结果 ptr=”12345“
} 

4.3 find/rfind

size_t find (const string& str, size_t pos = 0) const;
size_t find (const char
s, size_t pos = 0) const;
size_t find (const char
s, size_t pos, size_t n) const;
size_t find (char c, size_t pos = 0) const;**

从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
在这里插入图片描述
此处我使用的是省略第二个参数,那么它所默认的位置就是从0位置开始查找也就是从S3字符串的h开始查找。
rfind则是反向查找

4.4 substr

string substr (size_t pos = 0, size_t len = npos) const;
在str中从pos位置开始,截取n个字符,然后将其返回
这是一个很好玩的接口,从第n个字符开始截取字符串中m个字符返回赋予,当我们知道某个分字符串在总字符串中的位置的时候,就可以定向的将所知的分字符串赋予任意一变量
在这里插入图片描述
在string类中它充当的是字符串截取的功能


http://www.ppmy.cn/news/29107.html

相关文章

【Hello Linux】进程优先级和环境变量

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;简单介绍下进程的优先级 环境变量 进程优先级环境变量进程的优先级基本概念如何查看优先级PRI与NINI值的设置范围NI值如何修改修改方式…

【蓝桥杯嵌入式】LCD屏的原理图解析与代码实现(第十三届省赛为例)——STM32

&#x1f38a;【蓝桥杯嵌入式】专题正在持续更新中&#xff0c;原理图解析✨&#xff0c;各模块分析✨以及历年真题讲解✨都在这儿哦&#xff0c;欢迎大家前往订阅本专题&#xff0c;获取更多详细信息哦&#x1f38f;&#x1f38f;&#x1f38f; &#x1fa94;本系列专栏 - 蓝…

uniapp:3分钟搞定在线推送uni.createPushMessage,uni.onPushMessage

安卓端 在线推送功能演示&#xff1a; 1、dcloud后台申请开通uniPush dcloud后台 &#xff08;1&#xff09;&#xff1a;找到我的应用 &#xff08;2&#xff09;&#xff1a;点进去后&#xff0c;各平台信息&#xff0c;点击新增 &#xff08;3&#xff09;&#xff1a;填…

2.单例模式

基本概念 单例模式&#xff1a;保证一个类只有一个实例&#xff0c;并提供一个访问该实例的全局访问点 常见应用场景 读取配置文件的类一般设计为单例模式网站计数器应用程序的日志应用&#xff0c;因为共享日志文件一直处于打开状态&#xff0c;只能有一个实例去操作Spring…

Android TV UI开发常用知识

导入依赖 Google官方为Android TV的UI开发提供了一系列的规范组件&#xff0c;在leanback的依赖库中&#xff0c;这里介绍一些常用的组件&#xff0c;使用前需要导入leanback库。 implementation androidx.leanback:leanback:$version常用的页面 这些Fragment有设计好的样式&…

JavaEE进阶第六课:SpringBoot配置文件

上篇文章介绍了SpringBoot的创建和使用&#xff0c;这篇文章我们将会介绍SpringBoot配置文件 目录1.配置文件的作用2.配置文件的格式2.1 .properties语法2.1.1.properties的缺点2.2 .yml语法2.2.1优点分析2.2.2配置与读取对象2.2.3配置与读取集合2.2.4补充说明3.设置不同环境的…

GPU会变得更便宜吗?GPU 定价更新

在英伟达和AMD发布了一段时间的一致显卡之后&#xff0c;事情在二月份已经降温。没有新的GPU可以谈论&#xff0c;没有特别惊人的交易或任何东西&#xff0c;但仍然值得看看市场现在的表现如何&#xff0c;因为它已经稳定下来&#xff0c;以及我们在未来几个月可以期待什么。过…

2022 年江西省职业院校技能大赛高职组“信息安全管理与评估”赛项样题

2022 年江西省职业院校技能大赛高职组 “信息安全管理与评估”赛项样题 一、 赛项信息 第一场比赛&#xff1a; 竞赛阶段 任务阶 段 竞赛任务 竞赛时 间 分值 第一阶段 任务 1 网络平台搭建 90 平台搭建与安全 任务 2 网络安全设备配置与防护 210 设备配置防护…