【C++】string类的深入介绍

这篇具有很好参考价值的文章主要介绍了【C++】string类的深入介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C++】string类的深入介绍(1)

作者:爱写代码的刚子
时间:2023.5.26
本篇博客主要深入介绍string类、string类的常用接口及操作,string中迭代器的使用,以及string中的部分方法。(由于篇幅有限,剩余方法以及string的深浅拷贝将在之后的博客介绍)
前言:C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

C++参考网站:

C++参考
C++官网
如果方便地查找网页中的关键字可以使用ctrl + f进行搜索
以C++参考网站为例,演示查找string类:
【C++】string类的深入介绍

标准库中的string类

string类(了解即可)
  1. 字符串是表示字符序列的类
  2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作
    单字节字符字符串的设计特性。
  3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信
    息,请参阅basic_string)。
  4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits
    和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。
  5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。

总结:

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;
  4. 不能操作多字节或者变长字符的序列。
  • 在使用string类时,必须包含#include头文件以及using namespace std;
string类的常用接口说明(最常用的)

学会查文档对C++的学习是非常重要的!(以下使用参考网站为例):
【C++】string类的深入介绍
这里只列举的部分,大家学习的时候一定要学会查文档!

  • string类对象的常见构造
(constructor)函数名称 功能说明
string()(重点) 构造空的string类对象,即空字符串
string(const char* s)(重点) 用C-string来构造string类对象
string(size_t n,char c) string类对象中包含n个字符c
string(const string&s)(重点) 拷贝构造函数
  • string类对象的容量操作
函数名称 功能说明
size(重点) 返回字符串有效字符长度
length 返回字符串有效字符长度
capacity 返回空间总大小
empty(重点) 检测字符串释放为空串,是返回true,否则返回false
clear(重点) 清空有效字符
reserve(重点) 为字符串预留空间
resize(重点) 将有效字符的个数改成n个,多出的空间用字符c填充

注意:

  1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一
    致,一般情况下基本都是用size()
  2. clear()只是将string中有效字符清空,不改变底层空间大小。
  3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
  4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于
    string的底层空间总大小时,reserver不会改变容量大小。
  • string类对象的访问及遍历操作
函数名称 功能说明
operator(重点) 返回pos位置的字符,const string类对象调用
begin + end begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rend rbegin返回一个逆向迭代器,指向字符串的最后一个字符+rend返回一个逆向迭代器,指向字符串的开头(第一个字符的前一个位置)。
范围for C++11支持更简洁的范围for的新遍历方式
  • string类对象的修改操作
函数名称 功能说明
push_back 在字符串后尾插字符c
append 在字符串后追加一个字符串
operator+=(重点) 在字符串后追加字符串str
c_str(重点) 返回C格式字符串
find + npos(重点) 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr 在str中从pos位置开始,截取n个字符,然后将其返回

注意:

  1. 在string尾部追加字符时,s.push_back© / s.append(1, c) / s += 'c’三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
  2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。
  • string类非成员函数
函数 功能说明
operator+ 尽量少用,因为传值返回,导致深拷贝效率低
operator>>(重点) 输入运算符重载
operator<<(重点) 输出运算符重载
getline(重点) 获取一行字符串
relational operators(重点) 大小比较

【C++】string类的深入介绍

  • 需要注意的一个小点:
    在对string类使用<<的运算符重载进行比较时,我们一定要注意==<<的优先级较高(相较于普通的运算符)==,所有我们进行比较时要带上括号!
    【C++】string类的深入介绍

  • 正确使用:
    【C++】string类的深入介绍

    • npos静态变量的介绍:

【C++】string类的深入介绍
npos不是-1,而是整形的最大值(因为npos是无符号整型)
【C++】string类的深入介绍

  • 其他一些重要的修饰符和字符串操作:
    【C++】string类的深入介绍
    append(追加字符串)以及push_back(尾插一个字符)等一些函数已经实现了自动扩容(C++的好处,本质是字符管理的顺序表),但是建议使用 += ,因为 += 重载了这两种方法(例:string str;str += ('0' + val);(直接将整型val转成字符串))
    注意有些情况+=不能替代append
    下面是append具体信息:
    【C++】string类的深入介绍

具体用法查文档即可

详细介绍string::operator[]

示例:
【C++】string类的深入介绍

上述代码中str和a虽然都是字符串,但是str的实现逻辑是调用string::operator,而a的实现逻辑是*(a+1);(在clion编译器中编译器跳过了第9行的a[1];语句,没有执行(编译器的优化))

迭代器

string中的迭代器(任何容器都支持,用法都是类似的)

示例:
【C++】string类的深入介绍

  • iterator是像指针一样的类型,有可能是指针,有可能不是指针(封装的指针)。(其实iterator的底层是用指针来实现的)
  • 范围for(底层替换为迭代器,可以查看反汇编代码,一个类支持迭代器就支持范围for)
    【C++】string类的深入介绍

以上代码中若要进行对str2的修改可以使用引用:
【C++】string类的深入介绍

  • 链表中使用迭代器
    【C++】string类的深入介绍
    iterator提供了一种统一的方式,访问和修改容器的数据。算法通过迭代器去处理容器中的数据
  • 迭代器可以和容器进行配合
    以reverse函数举例:
    【C++】string类的深入介绍
    由于reverse提供了list模版,所以可以对链表实现逆置。
    当然,也可以使用范围for来替代迭代器:
    【C++】string类的深入介绍
string中的反向迭代器

【C++】string类的深入介绍
而范围for不能反向遍历

begin()、end()以及rbegin()、rend()具体指向的位置

如下图所示
【C++】string类的深入介绍

const迭代器

注意auto在自动识别类型时并不带上常量属性
【C++】string类的深入介绍

  • 如果我们想要使迭代器带上常量属性需要加上const_
    【C++】string类的深入介绍
    此时使用迭代器时不能改变存储在容器中的数据。
    附:其他迭代器补充:
    【C++】string类的深入介绍
    可以去作者提供的C++参考网站上去查询函数的具体用法(建议多查找网站)

string中的Capacity

【C++】string类的深入介绍

  • string类中有两种表示字符串长度的方法(size()和length()),这里只推荐使用size(),因为有些STL不支持length()(比如map)
max_size

max_size在不同的编译器上的结果不同。(所以使用时需谨慎,因为STL只是规范,它有许多不同的版本(大同小异),导致结果不同)
演示:
clion下:
【C++】string类的深入介绍

  • Linux下:
    【C++】string类的深入介绍
capacity

同max_size,在不同的编译器下的结果并不相同!
clion下:
【C++】string类的深入介绍
Linux下:
【C++】string类的深入介绍
同时不同的编译器的扩容机制也不相同
演示:
clion下:
【C++】string类的深入介绍

Linux下:
【C++】string类的深入介绍

clear(清理空间但并不释放空间

clion下:
【C++】string类的深入介绍
Linux下:
【C++】string类的深入介绍
所以clear()并不会释放空间

reserve(提前给string开空间)

【C++】string类的深入介绍
clion下:
clion即使清理了数据,也不会进行缩容
【C++】string类的深入介绍

Linux下:
如果清理了数据使用reserve就会进行缩容,缩为0
【C++】string类的深入介绍
如果没有清理数据也进行缩容,缩小到size大小
【C++】string类的深入介绍

不同的编译器reserve的效果不同,同时还与clear函数有关,clion下没实现缩容,而Linux的g++编译器下会实现缩容(使用clear清理数据后会缩到0,如果没有清理数据则会缩小到size大小)。

resize 不单单扩容,而是开空间加初始化(不给初始化值默认/0)

【C++】string类的深入介绍
resize如果给的值比原来string的size小,并不会缩容,capacity不会改变,空间没销毁,但是字符串的长度改变了 因为缩容是有代价的,所以resize不会改变空间,以免之后还要开空间文章来源地址https://www.toymoban.com/news/detail-481464.html

  • 如果想要实现缩容可以用shrink_to_fit函数(具体用法查网站即可),但不建议缩容。

到了这里,关于【C++】string类的深入介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【c++】string类的使用

    目录 一、标准库中的string类 1、简单介绍string类 2、string类的常用接口注意事项 2.1、string类对象的常用构造 2.2、string类对象的容量操作 2.3、string类对象的访问及遍历操作 2.4、string类对象的修改操作 二、string类的模拟实现         (1)string是表示字符串的字符串类;    

    2024年02月01日
    浏览(70)
  • 【C++】string类的基础操作

    💗个人主页💗 ⭐个人专栏——C++学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读 1. 基本概述 2. string类对象的常见构造 3. string类对象的容量操作 4. string类对象的访问及遍历操作 5. 迭代器 6. string类对象的修改操作 6.1 基本修改操作 6.2 c_str()函数 6.3 find + npos、rfind和

    2024年03月11日
    浏览(45)
  • C++ String类的基本使用

            放弃时间的人,时间也会放弃他。——莎士比亚 ; 本篇章是关于string类内一些函数的介绍以及使用方法,都是我们编程必须掌握的基础! ​ 全文共7000字左右. 话不多说安全带系好,发车啦 (建议电脑观看) 。 附:红色,部分为重点部分;蓝颜色为需要记忆的

    2024年02月09日
    浏览(35)
  • 【C++】String类的模拟实现。

    🎉博客主页:小智_x0___0x_ 🎉欢迎关注:👍点赞🙌收藏✍️留言 🎉系列专栏:C++初阶 🎉代码仓库:小智的代码仓库 string类中需要三个成员变量分别记录元素个数、容量和内容。还需要一个 size_t 类型npos-1表示整型的最大值。 这段代码是 string 类的构造函数。构造函数是在

    2024年02月13日
    浏览(42)
  • 【C++】string类的模拟实现

    前言:在上一篇中我们讲到了string类的使用方法,今天我们将进一步的去学习string类,去底层看看它顺带模拟实现部分的内容。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:高质量C++学习 👈 💯代码仓库:卫卫周大胖的学习日记💫 💪关注博主和博主一起学习!一起努

    2024年03月21日
    浏览(43)
  • String类的学习笔记(上):介绍String类及其常用方法的使用

    本文介绍了Java中用来描述操作字符串的String类,和其一些常用的基本操作方法,字符串的创建输出,字符串对象的比较,字符串查找,字符串的转化,字符串的替换,字符串拆分,字符串截取,和大小写转换,去除左右空格,子字符串包含,学会使用这些方法,能更方便的使用操作字符串~ 前言

    2023年04月23日
    浏览(58)
  • C++中string类的常用函数

    引言:在C语言中对于字符串的一些操作,例如在字符串末尾增加字符,对字符串拷贝等,我们可以通过调用库中函数来完成这些操作,在C++中,我们把这些常规操作封装成了string类,可以通过类对象直接调用这些函数,使得更加符合了面向对象的思想。 作用:返回字符串的有效字符长度

    2024年02月08日
    浏览(40)
  • 【C++】string类的深浅拷贝问题

    我们知道,定义一个类的时候,如果我们没有写构造,拷贝构造,赋值运算符重载,析构方法的话,编译器会自动生成。当该类成员中涉及到资源的管理时,实现的就是浅拷贝。所以,以上这几种方式是必须要程序猿手动实现的。 举例来看: 图中所示:实现了构造和析构,

    2023年04月26日
    浏览(40)
  • C++ 之 string类的模拟实现

    这学习我有三不学 昨天不学,因为昨天是个过去 明天不学,因为明天还是个未知数 今天不学,因为我们要活在当下,我就是玩嘿嘿~ –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–

    2024年04月27日
    浏览(31)
  • 【C++初阶】9. string类的模拟实现

    string类的完整实现放这里啦!快来看看吧 string类的作用就是将字符串类型实现更多功能,运算符重载,增删改查等等操作,所以其成员就包含char*的字符串 在之前的学习过程中,我们了解到类中存在的六个默认函数,其中就包含默认构造函数,那么对于string类是否需要用户自

    2024年02月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包