【C++打怪之路Lv8】-- string类

devtools/2024/10/18 19:35:09/

🌈 个人主页:白子寰
🔥 分类专栏:重生之我在学Linux,C++打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~
💡 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~)

目录

STL六大组件

什么是string

底层实现

为什么要学习string

string常用接口

构造函数

1、无参构造函数

2、带参构造函数

3、拷贝构造函数

4、构造n个单字符函数

容量操作接口

1、size();

2、length();

3、capacity();

4、reserve();

5、resize();

代码 && 4、5点总结 

访问和遍历

1、operator[]

2、迭代器

3、at

4、front and back

5、find and rfind (与npos)

6、c_str

修改字符串操作

1、operator+=

2、push_back

3、append

4、insert

5、erase

6、swap

7、operator+

8、getline

各种运算符重载函数

1、operator>> and operator<<

2、比较运算符,根据ASCII码值比较


STL六大组件


什么是string

在 C++ 中,string 是标准库中的一个类,它用于表示和处理字符串

string 类是定义在 <string> 头文件中的,它提供了丰富的成员函数来支持字符串的各种操作,如拼接、查找、替换等。

底层实现

string 类的底层实现通常依赖于动态数组,这个动态数组用于存储字符序列

具体来说,它通常包含以下三个部分:

  1. 字符数组:用于存储实际的字符串数据。
  2. 长度:记录当前字符串中的字符数量。
  3. 容量:记录当前分配的内存可以容纳的字符数量

以下是string类的私有成员:

template <typename _CharT, typename _Traits, typename _Alloc>
class basic_string {
private:_CharT* _MyPtr;       // 指向分配的内存的指针size_t _size;         // 字符串的长度size_t _capacity;     // 分配的内存容量
};

为什么要学习string

  1. 抽象度高:`string`提供高级抽象,简化内存管理。
  2. 功能丰富:内置操作集,提升开发效率。
  3. 安全性好:预防缓冲区溢出,保障程序安全。
  4. 跨平台:标准库组件,确保代码可移植性。

简单来说就是:省事、安全、通用、强大

  1. 省事:用`string`处理文字更方便,不用手动管理内存。
  2. 安全:用`string`不容易出错,减少程序崩溃的风险。
  3. 通用:不管在哪个系统,`string`的表现都一样,方便移植。
  4. 强大:`string`能干的事情多,比如查找、替换文字都很简单。

string常用接口

构造函数

1、无参构造函数

函数原型:string();
创建了一个空的string对象

2、带参构造函数

函数原型:string(const char* s);
用字符串(即以'\0'结尾的字符数组)初始化string对象

3、拷贝构造函数

函数原型:string& operator=(const string& str);
这个操作符重载函数允许你使用一个string对象来赋值给另一个已经存在的string对象

4、构造n个单字符函数

函数原型:string(size_t n,char c);
创建一个包含n个字符cstring对象


容量操作接口

1、size();

size_t size() const;

返回字符串中字符的数量

2、length();

size_t length() const;

与size()函数作用相同,实际没有什么区别; 返回字符串中字符的数量

3、capacity();

size_t capacity() const;

 返回字符串当前容量,即在不重新分配内存的情况下,字符串可以容纳的最大字符数

简单来说就是:像文本文件当前可以容纳多少字符而不会超出文件系统的分配

4、reserve();

void reserve(size_t new_cap);

 用来设置字符串的容量至少为new_cap

5、resize();

void resize(size_t  n);

 用来改变字符串的长度到n个字符 

代码 && 4、5点总结 


访问和遍历

1、operator[]

char& operator[](sizet pos);
允许像访问数组一样访问字符串中的单个字符。它返回指定位置pos的字符的引用

如果你提供的索引超出了字符串的范围,它不会检查边界,可能会导致未定义行为

2、迭代器

①正向迭代器:iterator begin();

②反向迭代器:reverse_iterator rbegin();

正向迭代器begin()返回指向字符串第一个字符的迭代器,

而反向迭代器rbegin()返回指向字符串最后一个字符的迭代器。

迭代器可以用来遍历字符串中的所有字符。

迭代器的本质是范围for

3、at

char& at(sizet pos);

返回指定位置pos的字符的引用

operator[]不同的是,如果pos超出了字符串的范围,at会抛出一个std::out_of_range异常。

4、front and back

front原型:char& front();

back原型:char& back();

front()返回字符串第一个字符的引用,

back()返回字符串最后一个字符的引用

如果字符串为空,这些操作将导致未定义行为

5、find and rfind (与npos)

find原型:sizet find(const string& str, sizet pos 0) const;

rfind原型:sizet rfind(const string& str, sizet pos npos) const;

find()从字符串的起始位置开始查找子字符串str返回第一次出现的位置索引。如果找不到,返回npos

rfind()从字符串的末尾开始查找子字符串str返回最后一次出现的位置索引。如果找不到,也返回npos

什么是npos?

npos是std::string类中的一个静态常量成员,表示不存在的位置,它的值通常是一个非常大的数,可以认为是字符串的最大可能大小加1

当查找函数返回npos时,意味着没有找到匹配项

6、c_str

const char* c_str() const;
返回一个指向以空字符终止的字符数组的指针,这个数组与字符串的内容相同。

这通常用于在需要C风格字符串的函数中使用std::string对象


修改字符串操作

1、operator+=

string& operator+=(const string& str); //追加一个string类
string& operator+=(const char* s);     //追加字符串
string& operator+=(char c);            //追加字符

用于将一个字符串或字符追加到当前字符串的末尾

2、push_back

void push_back(char c);

用于将一个字符添加到字符串的末尾

3、append

string& append(const string& str);        // 追加string
string& append(const char* s);            // 追加字符串
string& append(const char* s, size_t n);  // 追加字符串的前n个字符
string& append(size_t n, char c);         // 追加n个字符

用于将字符串或字符序列追加到当前字符串的末尾


 



4、insert

string& insert(size_t pos, const string& str);
string& insert(size_t pos, const char* s);
string& insert(size_t pos, const char* s, size_t n);
string& insert(size_t pos, size_t n, char c);
iterator insert(iterator p, char c);
void insert(iterator p, size_t n, char c);
void insert(iterator p, iterator first, iterator last);

用于在字符串的指定位置插入另一个字符串或字符序列

5、erase

string& erase(size_t pos = 0, size_t len = npos);
iterator erase(iterator p);
iterator erase(iterator first, iterator last);

用于从字符串中移除字符,可以移除单个字符,也可以移除一个范围内的字符


 



 

6、swap

void swap(string& str);

用于交换两个字符串的内容

7、operator+

string operator+(const string& str1, const string& str2);
string operator+(const string& str, const char* s);
string operator+(const char* s, const string& str);
string operator+(const string& str, char c);
string operator+(char c, const string& str);

用于连接两个字符串或字符串与字符

8、getline

istream& getline(istream& is, string& str, char delim = '\n');

用于从输入流中读取一行直到遇到指定的分隔符(默认是换行符),并将其存储到字符串中。

 


各种运算符重载函数

1、operator>> and operator<<

istream& operator>>(istream& is, string& str);
ostream& operator<<(ostream& os, const string& str);
  • operator>>:这个运算符重载用于从输入流(如 cin)读取字符串。它读取直到下一个空白字符(空格、制表符或换行符)为止的字符序列,并将其存储到字符串中
  • operator<<:这个运算符重载用于将字符串输出到输出流(如 cout)。它将字符串的内容输出到流中。

 

2、比较运算符,根据ASCII码值比较

bool operator==(const string& str) const;
bool operator!=(const string& str) const;
bool operator<(const string& str) const;
bool operator>(const string& str) const;
bool operator<=(const string& str) const;
bool operator>=(const string& str) const;

 


***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

“一个人可能走得更快,但一群人走得更远”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。


http://www.ppmy.cn/devtools/125332.html

相关文章

雷池社区版本SYSlog使用教程

雷池会对恶意攻击进行拦截&#xff0c;但是日志都在雷池机器上显示 如何把日志都同步到相关设备进行统一的管理和分析呢&#xff1f; 如需将雷池攻击日志实时同步到第三方服务器, 可使用雷池的 Syslog 外发 功能 启用 Syslog 外发 进入雷池 系统设置 页面, 配置 Syslog 设置…

基于java的企业车辆管理系统设计与实现(论文+源码)-kaic

摘 要 随着经济的日益增长,车辆作为最重要的交通工具,在企事业单位中得以普及,单位的车辆数目已经远远不止简单的几辆,与此同时就产生了车辆资源的合理分配使用问题。现有的车辆管理系统存在着不足之处&#xff0c;例如系统不够稳定&#xff0c;功能不够全面。因此&#xff0c…

facebook受众选择设置策略的最佳方式

在进行Facebookguanggao投放时&#xff0c;受众的选择是一个至关重要的步骤。正确的受众选择不仅能够帮助我们更好地定位目标用户&#xff0c;还能显著提高guanggao的转化率和投资回报率&#xff08;ROI&#xff09;。然而&#xff0c;受众选择的数量和范围同样是需要认真考虑的…

IP地址如何支持远程办公?

由于当今社会经济的飞速发展&#xff0c;各个方向的业务都不免接触到跨省、跨市以及跨国办公的需要&#xff0c;随之而来的远程操作的不方便&#xff0c;加载缓慢&#xff0c;传输文件时间过长等困难&#xff0c;如何在万里之外实现远程办公呢&#xff1f;我们以以下几点进行阐…

第八章:信息安全工程(8.1信息安全管理--8.3工程体系架构)

8.1 信息安全管理 8.1.1 保障要求 网络与信息安全保障体系中的安全管理建设&#xff0c;通常需要满足以下5项原则: (1) 网络与信息安全管理要做到总体策划&#xff0c;确保安全的总体目标和所遵循的原则。 (2)建立相关组织机构&#xff0c;要明确责任部门&#xff0c;落实具体…

10.高级存储过程技巧(10/10)

高级存储过程技巧博客大纲 引言 在现代数据库管理系统中&#xff0c;存储过程作为提升数据操作效率和安全性的关键工具&#xff0c;已被广泛应用于各种数据库操作中。存储过程是一组为了完成特定功能的SQL语句集合&#xff0c;这些语句在数据库中被保存、编译和优化&#xff0…

机器学习【金融风险与风口评估及其应用】

机器学习【金融风险与风口评估及其应用】 一、机器学习在金融风险评估中的应用1.提升评估准确性2.实现自动化和智能化3.增强风险管理能力4.信用评估5.风险模型6.交易策略7.欺诈检测 二、机器学习在金融风口评估中的应用1.识别市场趋势2.评估创新潜力3.优化投资策略4. 自然语言处…

实战OpenCV之视频处理

基础入门 视频是由一系列连续的图像帧组成的,这些帧按照一定的速率连续播放,从而形成动态画面。与视频相关的主要参数有:分辨率、帧率、码率、编解码器、帧类型、文件格式等,下面分别进行介绍。 1、帧率。表示每秒显示的图像帧数,该参数决定视频流畅度,更高的帧率意味着更…