STL 大锅炖(二):String 容器

STL 大锅炖(一):什么是 STL
STL 大锅炖(二):String 容器
STL 大锅炖(三):Vector 容器

个人博客内有更多精彩文章欢迎走过路过的大佬们点踩~ 👉 小北北北北的秘密小窝

前言

在上节中,我们详细的阐述了 STL 的来历、特性与组件,如果想了解 STL 前世今生的话可以去查阅上一篇文章:STL 大锅炖(一):什么是 STL

本节中将为大家介绍的就是 STL 中用于 字符串处理 的容器:String,它是 C++ STL 中的一个重要部分。它的特性使得用户可以使用 输入输出流(cin, cout) 的方式直接进行 String 操作,也可以通过 文件 等手段进行 String 操作




一、什么是 string

在 C 语言中,字符串通常采用 char* 进行存储,C++ 作为基于 C 的延申也继承了该特性,但在实际开发环境中,由于 C 风格字符串(本质上为一个空字符结尾的字符数组)在使用以及管理上都太过 复杂,不适用于大型项目的开发。为此,C++ 标准库中为字符串定义了一种 String 类型,头文件为<string>

与此同时,C++ 的算法库 <algorithm> 对 String 类也有着很好的支持,并且 String 类与 C 风格字符串之间也有着十分良好的接口,你可以十分轻松地在 String 与 C 风格字符串之间进行相互转换




二、string 与 C_string

在上述中有提到,C 语言中字符串通常采用 char* 的方式进行存储,但在大型程序中 char* 的使用以及管理较为复杂,为了解决该问题, C++ 引入了专门进行字符串处理的 String 类,下面将为大家讲述二者的 区别联系

1. string 与 C 风格字符串 的对比:

  • char* 是一个 字符指针,string 是一个
    • string 的实际存储类型是 char*( String 内封装着一个字符指针 char* )
    • string 管理着内部的 char* 指针,其本质是一个char* 型的 容器
    • string 将字符串的各种操作均封装成类内成员函数,在使用上极为方便
  • 在 string 内部中,char* 的 管理者 是 string,所以用户不用考虑内存释放与越界
    • string 管理着所有为 char* 分配的内存
    • string 的赋值,取值都由 string 类负责维护,不用担心赋值越界和取值越界等
    • string 的迭代器与符号重载使得 string 可以像 C 风格字符串一样使用 [ ] 进行 随机读写

2. string 与 C 风格字符串 之间的转换:

C++ 标准库中,String 类在提供各种各样方便操作的同时,在 String 与 C 风格字符串之间也提供了十分良好的接口,下面向大家介绍几种常见的转换:

  • String 转换为 char* :使用 string 类的 c_str()data() 函数
    • c_str() 与 data() 返回的是 const char*,在接收时需要用const char*进行接收
    • const char* 意味着其 返回值不可修改,若要进行字符串内容修改,先在 string 内修改后再转换
// 范例如下:
...
string str = "helloworld";
const char* c_str;
c_str = str.c_str();	// string::c_str() 返回 const char*
...
  • char*, char[ ] 转换为 string:直接进行赋值操作,将变量拷贝给 string 对象
    • string 类 重载 了 = 号,可直接将 char 数组赋值给 string 对象
    • 变量拷贝时仅作 值拷贝
// 范例如下:
...
char* c_str = "helloworld";
string str;
str = c_str;	// 直接赋值
...

在 C++ 中存在一个从 const char* 到 string 的隐式类型转换,却不存在从一个 string 对象到 c_str 的自动类型转换。对于 string 类型的字符串,可以通过 c_str() 函数返回 string 对象对应的 c_str

通常在编程过程中应坚持使用 string 类对象,直到必须将内容转化为 char* 时才将其转换为 c_str




三、string 的基本操作

接下来将为大家介绍的是 string 类的 常用操作 诸如:赋值存取拼接查找

1. 构造函数

string 类中重载了数种构造函数,满足了使用者绝大部分的需求,在创建一个 string 对象时可以对其进行特定形式的初始化如:空串、拷贝构造、字符串构造、字符构造等,string 类常用构造函数如下:

// 默认构造:创建一个空的字符串,如: string str;
string();

// 拷贝构造:使用一个 string 对象初始化另一个 string 对象
string(const string& str); 

// 使用字符串 c_str 初始化
string(const char* c_str);

// 使用 n 个字符 ch 初始化 
string(int n, char ch);

2. 赋值操作

string 类中提供了两种方法进行对象赋值:= 号直接赋值与 assign() 函数赋值,二者均有多种重载形式,重载的参数形式均为 charchar*string

tips: = 号赋值较为常用

// 将 c_str 赋值给 string 对象,重载的参数形式还有:string 与 char
string& operator=(const char* c_str);

// 将 c_str 赋值给 string 对象,重载的参数形式还有:string
string& assign(const char *c_str);

// 将 c_str 的前 n 个字符赋给当前的字符串
string& assign(const char *c_str, int n);

// 将 n 个字符 ch 赋给当前字符串
string& assign(int n, char ch);

// 将 str 从 start 开始 n 个字符赋值给字符串
string& assign(const string &str, int start, int n);

3. 随机存取

string 的 迭代器运算符重载 提供了两种方法进行数据的随机存取:[ ]at() 方法

// 范例如下:

string str = "helloworld";
str[0] = 'a';	// 首位修改为字符 a
str.at(0) = 'a';    // 首位修改为字符 a

随机存取的方式与 c_str 一样,不过 string 提供了额外的 at() 方法进行随机存取


4. 拼接操作

string 提供两种方法进行字符串拼接,其重载了 ‘+=’‘+’ 使得两个 string 对象可以进行直接拼接,另一种则是通过 append() 函数

// 范例如下:

string str1 = "hello";
string str2 = "world";
char* c_str = "world";

// 使用 += 
str1 += str2;
str1 += c_str;

// 使用 +
string str = str1 + str2;
string str = str1 + c_str;

// 使用 append() 在 string 末尾拼接
str1.append("world");
str1.append(str2);
str1.append(c_str);

以上方法均有 char*, char, 与 string 的重载形式


5. 查找和替换

string 提供了 两种查找方法一种替换方法

  • 查找:提供 find()函数 返回第一次出现的位置 与 rfind()函数 返回最后一次出现的位置
  • 替换:提供 replace()函数

以下是所有查找的重载形式:

int find(const string& str, int pos = 0) const; // 从 pos 开始查找 str 第一次出现位置
int find(const char* c_str, int pos = 0) const;  // 从 pos 开始查找 c_str 第一次出现位置
int find(const char ch, int pos = 0) const;  // 从 pos 开始查找 ch 第一次出现位置
int rfind(const string& str, int pos = npos) const;// 从 pos 开始查找 str 最后一次位置
int rfind(const char* c_str, int pos = npos) const;// 从 pos 开始查找 c_str最后一次位置
int rfind(const char* c_str, int pos, int n) const;// 从pos查找 c_str 的前 n 个字符最后一次位置
int rfind(const char ch, int pos = 0) const; // 从 pos 开始查找字符 ch 最后一次出现位置
string& replace(int pos, int n, const string& str); // 替换从 pos 开始 n 个字符为 str
string& replace(int pos, int n, const char* c_str); // 替换从 pos 开始的 n 个字符为 c_str

字符串 内部 的查找与替换在实际开发中不常用,仅作知识面扩充 ~


6. 插入和删除

string 提供了 一种插入方法一种删除方法

  • 插入:提供 insert()函数 支持 直接插入在字符串中间插入 两种插入形式,
  • 删除:提供 erase()函数

以下是插入与删除的重载形式:

...
// 在 string 中的 pos 位置插入 c_str
string& insert(int pos, const char* c_str);

// 在 string 中的 pos 位置插入 str
string& insert(int pos, const string& str);

// 在 string 中的 pos 位置插入 n 个字符 ch
string& insert(int pos, int n, char ch;

// 删除从 pos 位置开始的 n 个字符 
string& erase(int pos, int n);
...

7. 比较大小

string 的大小比较中,由于重载了大于号小于号,因此同样提供了两种大小比较的方法

Tips:比较的基准均为 Ascii 码值,大于(>)时返回 1,小于(<)时返回 -1,相等(==)时返回 0

  • 使用 compare() 进行比较
  • 使用 > 与 < 直接进行比较
// 范例如下:
...
// 使用 '>'号,'<'号 直接进行比较:以 Ascii 值逐位比较大小
string str1 = "abc";
string str2 = "abd";
cout << (str3 > str2) << endl;	// cout 结果为 0

// 使用 compare 进行比较
int compare(const string &s) const;//与字符串s比较
int compare(const char *s) const;//与字符串s比较
...



小结

在开发过程中,字符串的处理十分常见,在 C++ 中从 C 语言中集成而来的 C_string 在使用及管理上均较为复杂,于是引进了 string 类,在日常的 C++ 程序开发中 string 作为一个十分常用的 STL 容器有必要全面掌握,在理解其原理后再使用 string 进行开发一定会事半功倍

以上便是有关 STL 中关于 string 的概述,如果本文对你有帮助,不如分享给朋友或留下评论支持一下作者 ~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值