首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C++篇】与STL的初见:string类的主要接口简介

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

作者头像
我想吃余
发布2025-04-16 13:27:46
发布2025-04-16 13:27:46
2000
举报
文章被收录于专栏:C语言学习C语言学习

前言

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

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

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

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

一、string类 VS 字符串

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

以字符串的拼接为例:

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

代码语言:javascript
复制
#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类时:

代码语言:javascript
复制
#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对象,即空字符串
代码语言:javascript
复制
string s1;// 构造空的string类对象s1
  • string(const char* s):用普通字符串来构造string对象
代码语言:javascript
复制
string s2("hello world");// 用C格式字符串构造string类对象s2
  • string(const string& str):拷贝构造
代码语言:javascript
复制
string s3(s2);// 拷贝构造s3
  • string(size_t n, char c):在string类对象中构造n个字符c
代码语言:javascript
复制
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()

返回字符串的首尾迭代器,用于反向遍历字符串

范围for

C++11支持更简洁的范围for的新遍历方式

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

迭代器iterator

代码语言:javascript
复制
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个字符,然后将其返回
代码语言:javascript
复制
string substr (size_t pos = 0, size_t len = npos) const;
1.7 string对象转化为字符串指针操作

string::c_str

  • c_str:返回C格式的字符串(char*指针)
代码语言:javascript
复制
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. 不能操作多字节或者变长字符的序列。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 一、string类 VS 字符串
    • 二、标准库中的string类
      • 1. string类的常用接口
      • 2.string类 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档