【C++】STL之string 超详解

目录

1.string概述

 2.string使用

1.构造初始化

2.成员函数 

1.迭代器

2.容量操作

 1.size和length   返回字符串长度

2.resize   调整字符串大小

3.capacity   获得字符串容量

4.reserve  调整容量

5.clear  清除

6.empty   判空

3.string插入、追加  、拼接

1.运算符+=  、append

2. push_back

3.insert 

 4.string删除、替换

1.erase

2.pop_back

3. replace

5.字符串操作

1.c_stl

2.data

 3.copy

4.find、rfind

5.find_first_of、find_last_of

6.substr    子串处理

3.string反转(reverse)

4.非成员函数 

1.getline(读取)

2.swap(交换)

3. relational operators(比较)

5.访问遍历 

 6.静态成员常量(npos)


1.string概述

C++的标准库中定义了string类

1. string是表示字符串的字符串类  

2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作

下面是C++的官方网站,若有疑问,可在网站中查询学习 

string - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/string/string/

 2.string使用

1.构造初始化

#include <iostream>
#include <string>
using namespace std;int main()
{string s1;string s2("hello world");string s3 = s2;string s4(s2);string s5(s2, 1, 6);//用另一个字符串的区间构造cout << s5 << endl;string s6(s2, 1);//用另一个字符串的区间构造cout << s6 << endl;string s7(s2, 1, 100);//用另一个字符串的区间构造cout << s7 << endl;string s8("hello world", 5);//用另一个字符串的区间构造,且只拷贝构造前5个字符cout << s8 << endl;string s9(10, 'x');//单字符构造,构造十个字符cout << s9 << endl;//赋值运算符重载构造s1 = s2;s1 = "world";s1 = 'x';return 0;
}
ello w
ello world
ello world
hello
xxxxxxxxxx

2.成员函数 

1.迭代器

迭代器是一种可以统一使用的遍历方式,迭代器类似于C里面的指针

我们可以使用 begin()end() 函数来获取字符串的起始和结束,除了使用迭代器来遍历字符串,我们还可以使用迭代器来进行插入、删除等操作

begin和end是正向迭代器,rbegin和rend是反向迭代器

具体操作请看目录 5.访问遍历

2.容量操作

C++的string类提供了许多与字符串容量相关的接口

 1.size和length   返回字符串长度

两者作用相同,都是返回字符串长度,平常推荐用size,其他容器也是用size

string s1("hello world");
cout << s1.size() << endl;
cout << s1.length() << endl;
2.resize   调整字符串大小

 resize调整字符串的大小。该方法可以接收一个参数,用于指定字符串的新大小。如果新大小小于当前大小,则丢弃超出新大小的字符;如果新大小大于当前大小,则在末尾添加空字符或指定的字符。

 string str = "Hello";// 调整字符串为 10 个字符,并在末尾添加 '!'str.resize(10, '!');cout << str << endl;// 调整字符串为 3 个字符,丢弃超出的字符str.resize(3);

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

3.capacity   获得字符串容量

获取字符串的容量

string str = "Hello";
cout << str.capacity() << endl;

需要注意的是,字符串的容量并不一定等于字符串的长度(即字符的个数)。容量表示的是在不重新分配内存的情况下,字符串所能容纳的最大字符数。当字符串的长度超过当前容量时,可能会触发重新分配内存的操作。

4.reserve  调整容量

预留字符串的存储空间,以避免频繁的内存重新分配操作

string str = "Hello";// 预留至少 20 个字符的存储空间
str.reserve(20);// 获取字符串的容量
cout << "Capacity after reserving space: " << str.capacity() << endl;

通过预留存储空间,我们可以避免频繁的内存重新分配操作,从而提高程序的性能和效率。当我们预先知道要存储的字符串较大时,预留足够的存储空间可以减少内存分配的次数,节省时间和资源。需要注意的是,reserve() 方法只会增加字符串的容量,而不会改变字符串的长度。 

5.clear  清除

清空字符串中的内容,使其成为空字符串

string str = "Hello";
// 清空字符串的内容
str.clear();

通过使用clear()方法,我们可以方便地清空字符串的内容,使其变为空字符串。这在需要重复使用同一个字符串对象时非常有用,可以避免反复创建新的字符串对象,节省内存和提高效率。

6.empty   判空

判断字符串是否为空,即字符串的长度是否为 0。

empty() 方法返回一个布尔值,表示字符串是否为空。如果字符串为空,则返回 true;否则返回 false。 

string str = "Hello";
// 判断字符串是否为空
if (str.empty()) {cout << "The string is empty." << endl;
}
else {cout << "The string is not empty." << endl;
}

3.string插入、追加  、拼接

1.运算符+=  、append

实现字符串的拼接

 string str = "Hello";// 使用运算符+=,append拼接新的字符串str += " World!";str.append(" World!");

 无论是使用运算符+=还是append()方法,都可以实现字符串的拼接。选择使用哪种方式取决于个人偏好和代码的可读性

2. push_back

向字符串末尾添加一个新的字符

string str = "Hello";
// 向字符串末尾添加新的字符
str.push_back('!');
3.insert 

在字符串的指定位置之前插入字符、子字符串或其他字符串

basic_string& insert(size_type pos, const basic_string& str);
basic_string& insert(size_type pos, const basic_string& str, size_type pos1, size_type n);
basic_string& insert(size_type pos, const CharT* cstr);
basic_string& insert(size_type pos, const CharT* cstr, size_type n);
basic_string& insert(size_type pos, size_type n, CharT c);
iterator insert(const_iterator p, size_type n, CharT c);
template<class InputIterator>
iterator insert(const_iterator p, InputIterator first, InputIterator last);
string str = "Hello world";
// 在位置 5 插入一个空格
str.insert(5, " ");
// 在位置 6 插入子字符串 "beautiful"
str.insert(6, "beautiful", 0, 9);

 注意,该操作时间复杂度较高,应少用

 4.string删除、替换

1.erase

删除字符串中的字符或子字符串

basic_string& erase(size_type pos = 0, size_type n = npos);
iterator erase(const_iterator p);
iterator erase(const_iterator first, const_iterator last);

参数 pos 表示要删除的起始位置,参数 n 表示要删除的字符数。通过 erase() 方法,可以删除指定位置或指定区间的字符或子字符

string str = "Hello world";
// 删除位置 5 开始的 6 个字符
str.erase(5, 6);
// 删除最后一个字符
str.erase(str.end() - 1);
2.pop_back

删除最后一个字符

string str = "Hello";
// 删除最后一个字符
str.pop_back();
3. replace

替换字符串中的字符或子字符串

basic_string& replace(size_type pos, size_type count, const basic_string& str);
basic_string& replace(const_iterator first, const_iterator last, const basic_string& str);
basic_string& replace(size_type pos, size_type count, const basic_string& str, size_type pos2, size_type count2);
basic_string& replace(size_type pos, size_type count, const CharT* cstr, size_type count2);
basic_string& replace(const_iterator first, const_iterator last, const CharT* cstr, size_type count2);
basic_string& replace(size_type pos, size_type count, const CharT* cstr);
basic_string& replace(const_iterator first, const_iterator last, const CharT* cstr);
basic_string& replace(size_type pos, size_type count, size_type count2, CharT ch);
basic_string& replace(const_iterator first, const_iterator last, size_type count2, CharT ch);
template<class InputIterator>
basic_string& replace(const_iterator first, const_iterator last, InputIterator first2, InputIterator last2);

参数 pos 表示要替换的起始位置,参数 count 表示要替换的字符数,参数 str 表示替换后的新字符串,参数 cstr 表示以空字符结尾的 C 风格字符串,参数 count2 表示要替换的字符数,参数 ch 表示要替换的单个字符。通过 replace() 方法,可以在指定位置替换字符或子字符串。 

string str = "Hello world";// 替换位置 6 开始的 5 个字符为 "beautiful"
str.replace(6, 5, "beautiful");

5.字符串操作

1.c_stl

获取字符串对象的以空字符结尾的 C 风格字符串。

const char* c_str() const noexcept;

通过调用 c_str() 方法,可以获取一个指向字符串对象的以空字符结尾的 C 风格字符串的指针。这个指针可以用于与需要 C 风格字符串作为参数的函数进行交互,或者直接打印输出字符串。

string str = "Hello";
// 获取 C 风格字符串指针
const char* cstr = str.c_str();

需要注意的是,通过 c_str() 方法获取的 C 风格字符串指针是只读的,不应该修改其中的内容。同时,在字符串对象生命周期结束之前,这个指针是有效的,但在字符串对象发生改变(如进行增删改操作)时,这个指针可能会变得无效。因此,在使用 c_str() 方法获取的指针时,应该注意有效性和不可修改性。

2.data

获取字符串对象的数据存储区域的指针。

const char* data() const noexcept;

通过调用 data() 方法,可以直接获取一个指向字符串对象数据存储区域的指针。这个指针可以用于与需要字符数组作为参数的函数进行交互,或者直接访问和修改字符串的内容。

需要注意的是,通过 data() 方法获取的指针并不保证以空字符结尾,因此在使用时应该谨慎处理。如果需要获取以空字符结尾的 C 风格字符串,可以使用 c_str() 方法。

string str = "Hello";// 获取数据存储区域指针
const char* pdata = str.data();// 修改第一个字符为 'h'
*pdata = 'h';
 3.copy

通过调用 copy() 方法,可以将字符串对象中的字符复制到指定的目标字符数组中

string str = "Hello";
char dest[10];// 复制字符串到目标字符数组
str.copy(dest, 5);// 在目标字符数组末尾添加空字符
dest[5] = '\0';
4.find、rfind

查找一个子串

size_t find(const std::string& str, size_t pos = 0) const noexcept;

 通过调用 find() 方法,可以在字符串对象中查找指定的子串,并返回子串第一次出现的位置。参数 str 是要查找的子串,pos 是查找的起始位置,默认为 0。

string str = "Hello, world!";// 查找子串 ", "
size_t pos = str.find(", ");// 如果找到,则截取子串前面的部分并打印输出
if (pos != std::string::npos) {cout << str.substr(0, pos) << std::endl;  // 输出 "Hello"
}

需要注意的是,如果 find() 方法没有找到指定的子串,它会返回 std::string::npos,这是一个常量,表示未找到。因此,在判断是否找到了子串时,应该使用 !=std::string::npos 的形式。 

 rfind() 方法和 find() 方法类似,但是它是从字符串的末尾开始查找子串或字符。

5.find_first_of、find_last_of

在字符串中查找参数中任何一个字符第一次出现的位置

size_t find_first_of(const std::string& str, size_t pos = 0) const noexcept;
size_t find_first_of(const char* s, size_t pos, size_t n) const noexcept;
size_t find_first_of(char c, size_t pos = 0) const noexcept;

可以传递一个字符串、一个字符数组或一个字符作为参数。这些函数会返回参数中任何一个字符第一次出现的位置,如果未找到则返回 std::string::npos。 

string str = "Hello, world!";
// 查找参数中任何一个字符第一次出现的位置
size_t pos1 = str.find_first_of("aeiou");
if (pos1 != std::string::npos) {cout << "First vowel found at position: " << pos1 << endl;
}
else {cout << "No vowels found" << endl;
}// 从指定位置开始查找参数中任何一个字符第一次出现的位置
size_t pos2 = str.find_first_of("aeiou", pos1 + 1);
if (pos2 != std::string::npos) {cout << "Next vowel found at position: " << pos2 << endl;
}
else {cout << "No more vowels found" << endl;
}

在这个示例中,我们首先使用 find_first_of 查找字符串中第一个元音字母的位置,然后从该位置的下一个字符开始继续查找下一个元音字母的位置。 

find_last_of与fi_first_of类似,用于在字符串中查找参数中任何一个字符最后一次出现的位置。

6.substr    子串处理

从当前字符串中提取子字符串

td::string substr(size_t pos = 0, size_t count = std::string::npos) const;
  • pos 参数指定要提取的子字符串的起始位置,默认为 0。
  • count 参数指定要提取的字符数目,默认为 std::string::npos,表示提取从起始位置到字符串末尾的所有字符。
string str = "Hello, world!";// 提取从第7个字符开始的子字符串
string sub1 = str.substr(6);
std::cout << "Substring starting from position 6: " << sub1 << endl;// 提取从第7个字符开始的3个字符
string sub2 = str.substr(6, 3);
cout << "Substring of length 3 starting from position 6: " << sub2 << endl;

3.string反转(reverse)

在 C++ 中,可以通过使用 std::reverse 算法来反转容器(比如 std::stringstd::vector 等)中的元素。

string str = "Hello, world!";// 反转字符串
reverse(str.begin(), str.end());

4.非成员函数 

1.getline(读取)

用于从输入流中读取一行文本的函数

cin不能读取带空格的字符串,getline可以

 std::string input;// 从标准输入中读取一行文本std::cout << "Please enter a line of text: ";std::getline(std::cin, input);// 输出读取的文本std::cout << "You entered: " << input << std::endl;
2.swap(交换)

用于交换两个字符串的内容。这个函数会以常数时间完成字符串的交换,因此比使用复制和赋值运算符更有效率。

string str1 = "Hello";
string str2 = "World";// 使用 std::string::swap 交换 str1 和 str2 的内容
str1.swap(str2);
3. relational operators(比较)

在 C++ 中,字符串 std::string 类型支持使用关系运算符(relational operators)进行比较操作。这些关系运算符可以用于比较两个字符串对象之间的大小关系,例如判断两个字符串是否相等、大小关系等。

以下是 std::string 类型支持的关系运算符:

  1. ==:检查两个字符串是否相等。
  2. !=:检查两个字符串是否不相等。
  3. <:检查一个字符串是否小于另一个字符串。
  4. >:检查一个字符串是否大于另一个字符串。
  5. <=:检查一个字符串是否小于或等于另一个字符串。
  6. >=:检查一个字符串是否大于或等于另一个字符串。

这些关系运算符可以在比较字符串时非常有用。例如,你可以使用这些运算符来对字符串进行字典序的比较,或者在排序算法中对字符串进行排序。

  std::string str1 = "apple";std::string str2 = "banana";if (str1 == str2) {std::cout << "str1 is equal to str2" << std::endl;} else if (str1 < str2) {std::cout << "str1 is less than str2" << std::endl;} else {std::cout << "str1 is greater than str2" << std::endl;}

5.访问遍历 

string的遍历有三种方式:1.下标 2.迭代器 3.范围for 

#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");//1.下标for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << " ";}//2.迭代器string::iterator it = s1.begin();while (it != s1.end()){cout << *it << " ";++it;}//3.范围forfor (auto e : s1){cout << e << " ";}return 0;
}

 6.静态成员常量(npos)

nposstd::string 类型中的一个静态成员常量,它通常被用来表示字符串中没有匹配项或者没有找到所寻找的子串的位置。npos 通常被定义为 std::string::npos,其值为一个特定的整数(通常是 -1 或者是一个很大的正整数),这个整数的值可以保证不会和有效的字符串下标产生冲突

举个例子,当你在字符串中查找某个子串时,如果没有找到这个子串,则返回的位置是 std::string::npos。在 std::string::find() 函数中,如果找到了子串,那么它会返回子串在字符串中的位置,否则会返回 std::string::npos

                                   以上就是本篇文章的全部内容,谢谢观看

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

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

相关文章

DataBinding源码浅析---初始化过程

作为Google官方发布的支持库&#xff0c;DataBinding实现了UI组件和数据源的双向绑定&#xff0c;同时在Jetpack组件中&#xff0c;也将DataBinding放在了Architecture类型之中。对于DataBinding的基础使用请先翻阅前两篇文章的详细阐述。本文所用代码也是建立在之前工程基础之…

利用Windows10漏洞破解密码(保姆级教学)

前言: 本篇博客只是技术分享并非非法传播知识,实验内容均是在虚拟机中进行,并非真实环境 正文: 一.windows10电脑密码破解 1)开启windows10虚拟机,停留在这个页面 2&#xff09;按5次Shift键,出现这个粘滞键,如果没有出现的,则说明漏洞已经修复 3)重新启动,在这个页面的时候…

P1928 外星密码

网址如下&#xff1a; P1928 外星密码 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) C的string真的是太好用辣&#xff01; 思路就是用一个函数来递归翻译 代码如下&#xff1a; #include<iostream> #include<string> #include<cctype> using namespace…

C++重新入门-字符串

C 提供了以下两种类型的字符串表示形式&#xff1a; C 风格字符串C 引入的 string 类类型 1.C 风格字符串 C 风格字符串是使用字符数组来表示的&#xff0c;以空字符 \0 结尾。它们通常被称为 "C-style strings"。例如&#xff1a; char str[] "Hello"…

CSC8014: Software Development – Advanced Techniques 第二周

2.3 Introduction to the Collections Framework The Collections Framework • A unified, generic framework for the representation and manipulation of groups of objects –Manipulation is independent of representation • Includes: –Interfaces that define typ…

(三十五)大数据实战——Superset可视化平台搭建

前言 本节内容是关于Apache Superset可视化平台的搭建&#xff0c;Apache Superset是一个现代的数据探索和可视化平台 。它功能强大且十分易用&#xff0c;可对接各种数据源&#xff0c;包括很多现代的大数据分析引擎&#xff0c;拥有丰富的图表展示形式&#xff0c;并且支持自…

fatal error: rtiostream_utils.h: No such file or directory, rtiostream.h

fatal error: rtiostream_utils.h: No such file or directory 我的设置&#xff1a;

C++ //练习 6.23 参考本节介绍的几个print函数,根据理解编写你自己的版本。依次调用每个函数使其输入下面定义的i和j

C Primer&#xff08;第5版&#xff09; 练习 6.23 练习 6.23 参考本节介绍的几个print函数&#xff0c;根据理解编写你自己的版本。依次调用每个函数使其输入下面定义的i和j&#xff1a; int i 0, j[2] {0, 1};环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff…

UE5 播放本地MP3、MP4

1.创建一个媒体播放器 2.如创建视频&#xff0c;勾选。 它会多一个媒体纹理给你 3.1 设置音频 在一个actor上添加“媒体音频组件” “音频媒体播放器”赋值给它 3.2播放音频 添加一个音频媒体播放器变量&#xff0c; 赋值 地址使用绝对地址 4.1设置视频 UI上创建一个imag…

Redis -- 安装客户端redis-plus-plus

目录 访问reids客户端github链接 安装git 如何安装&#xff1f; 下载/编译、安装客户端 安装过程中可能遇到的问题 访问reids客户端github链接 GitHub - sewenew/redis-plus-plus: Redis client written in CRedis client written in C. Contribute to sewenew/redis-p…

【算法设计与分析】有效的字母异位词

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次…

适配器模式:接口转换的艺术,让不匹配成为过去式

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过将一个类的接口转换成客户期望的另一个接口&#xff0c;使得原本接口不兼容的类可以一起工作。在Java中&#xff0c;适配器模式可以通过实现一个适配器类来实现两个不兼容接口之间的转…

【Linux进阶之路】网络——“?“(上)

文章目录 一、历史发展1. 独立形态2. 互联形态3. 局域网 二、网络协议1.OSI七层协议2.TCP/IP四&#xff08;五&#xff09;层模型 三、网络通信1.封装与解包2.数据的传输1.局域网2.广域网 总结尾序 本篇文章的目的是带大家初步认识网络&#xff0c;为后面的网络编程打下基础&am…

原神4.0.1单机版【开局满级】纯单机,无限原石材料

版本介绍 版本4.0.1稳定版【过分追新并不稳&#xff0c;合理才完美】 独家原神&#xff0c;游戏内自带剧情任务&#xff0c;完美仿官&#xff0c;一比一完美复制&#xff01; 已经拥有完美剧情、任务、副本、卡池、深渊、全物品、和全部功能和皮肤。 修改注意 如果要进行不…

Swift Combine 有序的异步操作 从入门到精通十二

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

C++:类的继承和派生

2.1继承 继承是面向对象的主要特征&#xff08;此外还要封装和多态&#xff09;之一&#xff0c;它使得一个类从现有类中派生&#xff0c;而不必重新定义一个新类。继承的实质就是用已有的数据类型创建新的数据类型&#xff0c;并保存已有数据类型的特点&#xff0c;以旧类为基…

Python爬虫之Ajax数据爬取基本原理

前言 有时候我们在用 requests 抓取页面的时候&#xff0c;得到的结果可能和在浏览器中看到的不一样&#xff1a;在浏览器中可以看到正常显示的页面数据&#xff0c;但是使用 requests 得到的结果并没有。这是因为 requests 获取的都是原始的 HTML 文档&#xff0c;而浏览器中…

编译安装mysql指定版本 shell脚本

要使用Shell脚本编译安装指定版本的MySQL&#xff0c;你需要下载源代码并按照官方文档的指引进行编译和安装。以下是一个简化的示例&#xff0c;用于下载、解压、编译和安装指定版本的MySQL&#xff1a; #!/bin/bash yum install -y wget cmake gcc yum install -y bzip2 bzi…

春节过半,预定的计划还没有开始

春节前就立下雄心勃勃的计划&#xff0c;想利春节假期开始搭一个人脸通WEB管理软件。但眼看春节过半&#xff0c;自己还没有开始动手呦。哎&#xff0c;突然紧张起来了。初二初三身体都不太舒服&#xff0c;不知道是怎么回事就感冒了&#xff0c;今晚更是高烧39.5&#xff0c;感…

【后端高频面试题--Linux篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 后端高频面试题--Linux篇 Windows和Linux的区别&#xff1f;Unix和Linux有什么区别&#xff1f…