我与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 worldwoworldworld

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');//结果  helloxxxxxstr.resize(2);  //结果  hestr.resize(5);  //结果  hellocout << 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.mzph.cn/web/12966.shtml

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

相关文章

Weblogic 管理控制台未授权远程命令执行漏洞(CVE-2020-14882,CVE-2020-14883)

1 漏洞概述 Weblogic Pre-Auth Remote Command Execution 漏洞&#xff08;CVE-2020-14882, CVE-2020-14883&#xff09;是针对 Oracle WebLogic Server 的两个安全漏洞。CVE-2020-14882 允许远程用户绕过管理员控制台组件中的身份验证&#xff0c;而 CVE-2020-14883 则允许经…

Python3 笔记:Python的函数

函数是编写好的&#xff0c;可重复调用的&#xff0c;用来实现某一功能的一段代码。 也可以理解为做某事的方法和步骤。第一次做的时候写好了方法&#xff0c;下次同类型的事直接拿来就用。 Python 内部有很多功能强大的内置函数供我们使用&#xff0c;除此之外&#xff0c;你…

Nagle算法

Nagle算法简介 Nagle算法主要是避免发送小的数据包&#xff0c;要求TCP连接上最多只能有一个未被确认的小分组&#xff0c;在该分组的确认到达之前不能发送其他的小分组。 在默认的情况下,Nagle算法是默认开启的&#xff0c;Nagle算法比较适用于发送方发送大批量的小数据&…

Sam Blackshear谈Move语言的起源

Move编程语言作为Sui生态系统的关键组成部分&#xff0c;通过可编程交易区块等机制支持其独特的对象数据模型&#xff0c;并支持高效的代码。五年前&#xff0c;Mysten Labs的联合创始人兼首席技术官Sam Blackshear创建了Move。他专门设计了Move&#xff0c;用于编写智能合约&a…

数据库SQL查询语句汇总详解

SQL是一种强大的编程语句&#xff0c;可用于操作和提取数据库中的数据。如果你对编程语句有所让步&#xff0c;那么你可能对SQL的力量感到难以置信。本文将带你深入探索SQL查询的世界&#xff0c;让你了解SQL语句的各种查询方式&#xff0c;并以实例进行详解。 1. SELECT基础查…

Iterator底层源码分析

/** * Iterator用于遍历Collection下的集合&#xff0c;Collection下的每个集合底层实现不一样&#xff0c;意味着遍历逻辑也不一样&#xff0c; * 所以Java的设计者将Iterator设计成了接口&#xff0c;让Collection下的每个集合实现Iterator */ public interface Iterator<…

英伟达的GPU(1)

又好久没更新了,一方面是最近事情有点多,另一方面最近也确实有点懒。 之前我说要把硬件部分补完,要写Nvidia的GPU,我估计一篇写不完,所以先写点。 早先的硬件文章可以参考: 上一篇:解读神秘的华为昇腾910 (qq.com) 上上一篇Microsoft Maia (qq.com) 上上上篇Google的…

sqli-labs靶场第十四关

目录 1&#xff1a;分析 找闭合符&#xff1a; 2&#xff1a;开始注入 报错注入&#xff1a; 注入数据库名&#xff1a; 注入表名&#xff1a; 注入列名&#xff1a; 注入具体值&#xff1a; 1&#xff1a;分析 经过我们的实验发现当我们输入的密码后面存在双引号时会报…

【C++】学习笔记——多态_1

文章目录 十二、继承8. 继承和组合 十三、多态1. 多态的概念2. 多态的定义和实现虚函数重写的两个特殊情况override 和 final 3. 多态的原理1. 虚函数表 未完待续 十二、继承 8. 继承和组合 我们已经知道了什么是继承&#xff0c;那组合又是什么&#xff1f;下面这种情况就是…

英语学习笔记13——A new dress

A new dress 一件新连衣裙 词汇 Vocabulary colour / color n. 颜色 v. 上色&#xff0c;涂色  英  美 颜色短语&#xff1a;green hand 新手      black tea 红茶      white house 白宫      black sheep 害群之马 英文颜色类词汇&#xff1a; red 红色…

鸿蒙开发接口Ability框架:【ApplicationContext】

ApplicationContext ApplicationContext模块提供开发者应用级别的的上下文的能力&#xff0c;包括提供注册及取消注册应用内组件生命周期的监听接口。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.m…

静态IP代理:网络世界的隐秘通道

在数字化时代&#xff0c;网络安全和隐私保护日益受到重视。静态IP代理作为一种网络服务&#xff0c;为用户提供了一个稳定且可预测的网络连接方式&#xff0c;同时保护了用户的在线身份。本文将从五个方面深入探讨静态IP代理的概念、优势、应用场景、技术实现以及选择时的考量…

C语言学习【printf函数和scanf函数】

C语言学习【printf函数和scanf函数】 printf()函数和scanf()函数可以让用户与程序交流&#xff0c;是输入/输出函数 printf()函数 请求printf()函数打印数据的指令要与待打印数据的类型相匹配。例如&#xff0c;打印整数时使用%d&#xff0c;打印字符时使用%c。这些符号被称…

实战项目技术点(1)

1、什么是REST&#xff1f; REST&#xff08;Representational State Transfer&#xff09;&#xff0c;表述性状态转换&#xff0c;它是一种软件架构风格。传统URL风格如下&#xff1a; http://localhost:8080/user/getById?id1 GET&#xff1a;查询id为1的用户 http://loc…

网络常识一:常用工具

作为后端开发&#xff0c;特别是网络游戏后端开发&#xff0c;经常需要处理各种现网问题&#xff0c;其中有不少是网络相关的。 下面列举的工具主要是在 linux 下的&#xff0c;诊断线上服务器问题的时候&#xff0c;往往是分秒必争&#xff0c;所以这些工具都要用得很熟练&am…

程序在银河麒麟系统下实现开机自启及创建桌面快捷方式

目录 1. 机器环境说明 2. 程序开机自启动设置 2.桌面快捷方式设置 3. 附加说明 1. 机器环境说明 机器安装的银河麒麟操作系统属性如下&#xff1a; 2. 程序开机自启动设置 第1步&#xff1a;编写一个脚本,用于自动化启动&#xff0c;为便于后文描述&#xff0c;该脚本名称…

干货教程【软件篇】| 免费实现游戏加速自由

需要这个游戏加速软件的小伙伴可以关注一下文章底部公众号&#xff0c;回复关键词【zdjs】即可获取。 该软件可以实现免费的游戏加速&#xff0c;实测延迟低体验好&#xff01; 建议看到后赶紧保存下来防止丢失&#xff01; 下面讲一下该软件安装流程~ 通过链接可以得到下面…

2.go语言初始(二)

本篇博客涉及到go 的基础数据类型、 go 语言中的运算符、转义字符、格式化输出、字符串操作 go 语言中的运算符 在 go 语言中&#xff0c;基本数据类型主要包括以下几类&#xff1a;整数类型、浮点数类型、复数类型、布尔类型、字符串类型、字节类型&#xff08;byte&#xf…

Linux进程控制——Linux进程程序替换

前言&#xff1a;Linux进程控制包含了进程终止&#xff0c;进程等待&#xff0c;进程程序替换。走到现在我们也只剩下进程程序替换没介绍了&#xff0c;那么让我们来看看进程程序替换到底是什么&#xff01; 本篇主要内容&#xff1a; 替换原理 替换函数 实现简易shell 我们所创…

【sql】sql中with as 介绍与使用jsqlparser解析sql

文章目录 一. 定义二. 用法三. 解析 一. 定义 with A as (select * from class) 也就是将重复用到的大批量 的SQL语句&#xff0c;放到with as 中&#xff0c;加一个别名&#xff0c;在后面用到的时候就可以直接用。对于大批量的SQL数据&#xff0c;起到优化的作用。 with子句…