【C++篇】与STL的初见:string类的主要接口简介

💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习!
👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对C++感兴趣的朋友



前言

接下来我们开始STL的学习之旅,进一步感受C++的给世界带来的编程盛宴。
本章的学习目的:

  1. 了解我们为什么要学习string类
  2. 了解标准库中的string类有哪些功能
  3. 可以得心应手地使用string类

声明:本文只介绍string类中我们常用的功能。
学习建议:

  • 建议先大致阅读string类文档,大概知道string类中有哪些内容即可:🖱string
  • 下文中会讲解string类常用的部分接口。有些我会直接提供接口文档链接,点击进入即可。还有些我会提供图片目录,进入我给出的string类文档对应查找即可。建议在看完我的讲解后去阅读相应文档,学习效果更好哦!

一、string类 VS 字符串

在C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,并且内存存储空间需要自己开辟,麻烦且容易出错,稍不留神可能还会越界访问。

以字符串的拼接为例:

用普通字符串我们要这样写代码:

#include<iostream>
using namespace std;

int main()
{
	char str1[10] = "wo xiang"
	char str2[20] = " chi yu"
	//拼接
	strcat(str1, str2);
	cout << str1 << endl;
	return 0;
}

当我们用string类时:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string str1 = "wo xiang";
    string str2 = " chi yu";

    // 使用 += 操作符进行拼接
    str1 += str2;
    cout << str1 << endl;
    return 0;
}

string类的优势显而易见。


二、标准库中的string类

1. string类的常用接口
1.1 string类对象的构造

相关文档

  • string():构造空的string对象,即空字符串
string s1;// 构造空的string类对象s1
  • string(const char* s):用普通字符串来构造string对象
string s2("hello world");// 用C格式字符串构造string类对象s2
  • string(const string& str):拷贝构造
string s3(s2);// 拷贝构造s3
  • string(size_t n, char c):在string类对象中构造n个字符c
string s4(6, x); //s4:xxxxxx
1.2 string类对象的容量操作

string
在这里插入图片描述

函数功能描述
size()返回字符串有效字符长度
length()返回字符串有效字符长度
capacity()返回空间总大小(容量)
empty()检测字符串是否为空,是返回true,否则返回false
clear()清空有效字符
reserve(size_t res_arg = 0)为字符串预留空间
resize(size_t n) resize(size_t n, char c)将有效字符个数改为n,多余的空间用字符c覆盖

💡提示:

  1. length()size()是完全相同的,但建议用size(),因为为了和其他容器保持一致
  2. clear()只是将有效字符清空,不会改变底层空间大小(capacity()
  3. reserve(size_t res_arg=0)为string预留空间,不改变元素个数,reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小大于时就会扩大容量大小。
  4. resize(size_t n) resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是:
  • resize(size_t n)0来填充多出的元素空间
  • resize(size_t n, char c)用字符c来填充多出的元素空间
    注意:resize在改变元素个数时,如果是将元素个数增多,会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
  1. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。
1.3 string类对象的访问及遍历

在这里插入图片描述

在这里插入图片描述

函数功能描述
operator[]返回或设置指定位置的字符
at()返回指定位置的字符并进行边界检查
begin()end()返回字符串的首尾迭代器,用于正向遍历字符串
rbegin()rend()返回字符串的首尾迭代器,用于反向遍历字符串
范围forC++11支持更简洁的范围for的新遍历方式

at()了解了解就行,平时基本用不上

迭代器iterator

string::iterator it = s1.begin();
while(it != s1.end())
{
	cout << *it << " ";
	++it;
}
cout << endl;

可以看到,iterator好像是像指针一样的类型。其实,他有可能是指针,也有可能不是指针。(至于为什么,就需要剖析其底层代码深入学习了,建议初学者先放一放)

总之,iterator是提供一种统一的方式去访问和修改容器的数据。

此外,还有反向迭代器reverse_iterator,原理相同。

1.4 string类对象的修改操作

在这里插入图片描述

函数功能描述
push_back(char c)在字符串后尾插一个字符c
append(const char& str) append(const char* s)在字符串后追加一个字符串
operator +=在字符串后追加字符串str
insert在字符串任意位置插入字符或字符串,用法详见insert
erase删除字符串任意位置部分,用法详见erase
replace替换字符串的一部分:replace
pop_back()尾删一个字符

这里主要重点掌握 operator +=,其他了解即可。

注意:

  • string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多。但一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
1.5 字符串查找函数
函数功能描述
find ()从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind()从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
find_first_of()查找字符集中的任意字符,返回第一次出现的pos位置
find_last_of() 查找字符集中的任意字符,返回最后一次出现的pos位置
  • 字符集就是字符集合

💡:这里函数的参数涉及string::npos,它是string类的一个常量静态成员变量。通常,它的值是一个最大的无符号整数(size_t-1

一般用来做查找失败的返回值。
在这里插入图片描述

1.6 字符串截取函数

string::substr

  • substr : 在str中从pos位置开始,截取n个字符,然后将其返回
string substr (size_t pos = 0, size_t len = npos) const;
1.7 string对象转化为字符串指针操作

string::c_str

  • c_str:返回C格式的字符串(char*指针)
const char* c_str() const;
1.8 字符串与数值转换操作
函数名功能说明文档链接
to_string()将数值转换为字符串文档
stoi()将字符串转换为整数文档
stof()将字符串转换为浮点数文档
1.8 string类的非成员函数

在这里插入图片描述

函数描述
operator== 判断两个字符串是否相等
operator!=判断两个字符串是否不相等
operator<判断当前字符串是否小于另一个字符串
operator>判断当前字符串是否大于另一个字符串
compare()进行详细的字符串比较,返回 0 表示相等,负值表示小于,正值表示大于
getline在我们输入字符串中时,如果中间有空格,cin就会停止读取,这时就需要用到这个函数,该函数默认换行结束输入,也可以自己设置符号,注意只能用于字符串输入

2.string类 总结
  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
  4. 不能操作多字节或者变长字符的序列。

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值