C++ [STL之string的使用]

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

C++ [STL之string的使用]

本文已收录至《C++语言》专栏!
作者:ARMCSKGT

C++ [STL之string的使用]

前言

字符串在程序中经常出现,C语言为此提供了很多字符串操作函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问,于是STL单独为字符串实现了一个容器,用来专门存储操作字符串,本文将介绍string的常用接口,有了string的加入,我们对字符串的操作将游刃有余!
C++ [STL之string的使用]


正文

编码


我们知道计算机是美国最先研究的,为了描述字符出台ASCII((American Standard Code for Information Interchange)美国信息交换标准代码)编码,在计算机存储和显示英文信息,是美国标准,ASCII仅需 1Byte 就能存储,所以计算机中字符类型为1字节。
C++ [STL之string的使用]

而我们现在最常用的是UTF-8标准,UTF-8标准兼容ASCII,在计算机中广泛使用!UTF-8最大的特点是根据不同范围的字符匹配使用不同的标准,因为ASCII 都是 0x??? 的形式,当识别到其他字符时,会匹配使用对应标准,比如当识别到汉字时,会使用 GBK 编码标准来进行输出(Windows)。
C++ [STL之string的使用]
随着计算机的普及,越来越多的国家开始使用计算机,于是为了兼容几乎所有国家,出台了Unicode(中文又称万国码、国际码),提出了能适用更多语言的编码标准,即 UTF-16 和 UTF-32。,Unicode是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。


basic_string类


说明

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

basic_string实例成员

  • string
    表示字符串的字符串类(本文主讲对象)。
  • wstring
    表示宽字符的字符串类,用来处理较长的字符串,在Windows下占2字节,Linux下占4字节。
  • u16string(C++11)
    匹配UTF-16标准,字符占位2字节。
  • u32string(C++11)
    匹配UTF-32标准,字符占位4字节。

    之所以有这么多basic_string字符串实例版本是为了适应不同国家语言字符串,而我们常用的是string类。
    C++ [STL之string的使用]

关于string

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

string类模块


构造函数

构造函数 功能
string() 默认构造函数
string (const string& str) 拷贝构造函数
string (const string& str, size_t pos, size_t len = npos) 从str中pos位置开始拷贝len个字符进行构造(默认将pos后的字符的全部拷贝,如果不足len个则也是全部拷贝)
string (const char* s) 通过字符串s构造
string (const char* s, size_t n) 从字符串s中拷贝n个字符构造
string (size_t n, char c) 构造n个c字符组成的字符串
string (InputIterator first, InputIterator last) 迭代器区间构造(迭代器介绍在后面)
//代码演示
#include <iostream>
using namespace std;
#include <string>

int main()
{
	const char* s = "ABCDEFGHIJKL\0";
	string s1; //默认构造
	string s2(s); //通过字符串s构造
	string s3(s2); //拷贝构造
	string s4(s3,2,5); //选择拷贝构造,从s3的2下标位置拷贝5个字符
	string s5(s, 5); //取s字符串中前五个字符构造
	string s6(10, 'a'); //10个字符a构造

	//迭代器区间构造(左闭右开区间)
	string s7(s, s + 12); //支持指针(指针也算是迭代器)
	string s8(s2.begin(), s2.end()); //通过容器迭代器构造(适用于所有支持迭代器的容器)

	return 0;
}

C++ [STL之string的使用]



空间大小相关

字符串长度及容量大小
  • size() 字符串大小
  • length() 字符串大小
    size与length几乎没区别,但是因为string是先于STL诞生的,后来为了统一于其他容器,增加了size,在使用时,主要以size为主!
  • capacity() 容量大小
    C++ [STL之string的使用]

清空字符串和空串查询
  • clear() 清空字符串(非释放对象)
  • empty() 查询字符串是否为空(空返回真)

字符串大小和容量设置
  • resize 设置字符串长度
    resize有两种调用方式,构成重载

    1.第一种是resize(size_t n) 将字符串设置为n,如果n小于当前字符串长度,则字符串长度缩小至n,如果大于n则字符串长度为n,增长的字符位初始化为0
    2.第二种是resize(size_t n,char c) 将字符串长度增长至n,如果n大于当前字符串长度,则增长的空间以字符c全部填充,如果低于字符串长度,则只修改字符串长度

    这里需要说明的是,如果resize的数量比当前容量大,则会进行扩容,但resize的数量比字符串小则只会抹除多余的字符,但并不会缩容,哪怕resize(0)也不会!
    C++ [STL之string的使用]
  • reserve(n) 设置容量为n
    我们可以手动设置字符串容量大小,以减小频繁扩容带来的性能损失! 虽然reserve可以设置容量,但是在VS平台下仍然不支持缩容,因为缩容的代价比扩容大,而且对于现代计算机来说这些少量空间没必要来回申请和释放!但如果我们在VS平台下reserve空间小于等于15时(在容量大于15的情况下),编译器会将前15个有效字符拷贝到缓冲区并释放申请的空间!在Linux平台下则是老老实实的缩容!
    C++ [STL之string的使用]
    这里要注意的是:
    VS的扩容策略是,VS预先有一个15字节大小的缓冲区,当我们的字符数量大于15时VS会开辟空间并通过指针管理,空间大小为30(第一次扩容为2倍),以后的每次扩容是1.5倍式增长,而且VS并不是稳定的按此算法去计算大小,每次都会多开一些空间。
    区别于VS,Linux下g++的string初识容量大小为0,扩容策略是第一次扩容为1,往后则是稳扎稳打的2倍式扩容,不会多开,而且可以缩容!
    C++ [STL之string的使用]


访问与遍历

头尾元素及字符串指针
  • front() 返回string中第一个字符
  • back() 返回string中最后一个字符
  • c_str() 返回字符串的指针类型
    string支持通过对象返回一个char类型指针指向字符串。

下标遍历
  • [ ] 下标访问
    string支持像访问数组一样访问字符串,越界会报错
  • at() 对象调用,下标访问
    功能与[ ]类似,但是at是通过对象调用且at下标越界时会抛异常
    C++ [STL之string的使用]

迭代器

迭代器成对出现,分别是 begin()指向第一个元素end()指向字符串末尾的下一个位置(即’\0’) ,所以迭代器是左闭又开区间;我们可以把迭代器想象成指针去使用,通过++/- -改变当前指向的元素位置,以及使用 " * " 解引用访问和修改,但迭代器本质不是指针

在使用迭代器时,不同容器有不同的迭代器且迭代器也分不同的类型,例如string的普通迭代器类型是 string::iterator 使用此类型定义一个迭代器并进行赋值!

获取容器迭代器只需要通过 类名::迭代器类型 即可定义迭代器!

  • 普通迭代器begin()与end()
    普通的迭代器支持的使用与指针没有区别
    普通迭代器类型定义:string::iterator
    C++ [STL之string的使用]
  • 反向迭代器rbegin()与rend()
    反向迭代器与普通迭代器不同点是,反向迭代器rbegin()指向字符串最后一个元素,rend()指向第一个元素的前一个位置(可以理解为-1),也是一个一闭一开区间,反向迭代器顾名思义,是倒着遍历的,++相当于普通迭代器的- -,其他的与普通迭代器相同
    反向迭代器类型定义: string::reverse_iterator
    C++ [STL之string的使用]
  • const迭代器cbegin()和cend()
    const迭代器类型定义: string::const_iterator
  • const反向迭代器crbegin()和crend()
    const反向迭代器类型定义: string::const_reverse_iterator

    const迭代器在原迭代器的基础上不能对迭代器所指向的元素进行修改,但是可以++/- -访问所有元素,在某些const传参的场景下会遇到

    虽然string有迭代器遍历,但是对于顺序性存储结构,大部分场景下还是使用 [ ] 下标遍历比较方便,所有支持迭代器的容器都支持范围for遍历元素
    C++ [STL之string的使用]


字符串插入与删除

字符串插入
  • push_back()
    push_back可以向字符串尾插一个字符
    C++ [STL之string的使用]
  • append()
    append的功能是在字符串尾部追加字符和字符串,而且有多种用法
    append有多个函数重载形式
    C++ [STL之string的使用]
    append的这些使用方法与前面构造函数的使用方式相似,有兴趣的小伙伴可以下去慢慢研究,不过最常用的是追加字符串!
    C++ [STL之string的使用]
  • operator += 运算符
    这个+=运算符的功能十分强大,是在尾部追加字符和字符串,在使用string时经常使用
    C++ [STL之string的使用]
  • operator = 运算符
    赋值运算符与平时使用一样,使用单个字符字符串直接覆盖原字符串!
    C++ [STL之string的使用]
  • insert
    insert支持任意位置插入字符串,插入依据既可以是下标也可以是迭代器
    insert也有许多重载形式
    C++ [STL之string的使用]
    不过,因为是任意位置插入,根据顺序表的性质,需要挪动元素,会有性能损失,一般按需使用!
    C++ [STL之string的使用]

删除字符串
  • erase
    erase支持任意位置删除,删除依据也是下标或迭代器
    erase也有三个重载版本
    –从pos位置开始删除len个字符(包括pos位置)
    –迭代器区间删除,删除first和last之间的字符串(左闭右开区间,删除范围从first开始,包括first,不包括last)
    C++ [STL之string的使用]
    C++ [STL之string的使用]
    这里要注意的是,与insert一样,顺序表删除元素是靠从后往前覆盖实现的,有一定的性能损失,一般情况下能少用就少用!

    关于npos
    这里要额外提一笔的是,npos在string中经常作为缺省参数出现,底层的机制是如果指定的操作长度大于字符串长度默认将此范围内一直到末尾的字符串全部进行操作,而npos是无符号整型-1,也就是整型的最大值,不过在不同平台,大小可能不同!
    C++ [STL之string的使用]


查找

  • find
    find有四种重载形式,也是查找字符串最常用的接函数C++ [STL之string的使用]> find只能使用下标进行查找,查找单个字符或字符串,在一个string中查找另一个string子串,返回的也是下标,如果没找到则返回npos(无符号整型的最大值),对于查找单个字符返回的是字符下标,查找字符串则是返回字符串首元素的下标!> C++ [STL之string的使用]
  • rfind
    rfind也有四个重载形式的函数,基本上与find保持一致,最大的特点是rfind是从后往前查找,反向遍历!
    C++ [STL之string的使用]
  • find_first_of
    这个函数比较特殊,查找字符串中出现的任意字符,默认pos位置是0(从头开始),可以指定起始查找位置,该函数有四种重载形式
    C++ [STL之string的使用]
  • find_last_of
    与find_first_of基本相似,只不过find_last_of是从后往前找
  • find_first_not_of
    与find_first_of类函数相反,在字符串中搜索与其参数中指定的任何字符不匹配的第一个字符
    该函数有四种重载形式
    C++ [STL之string的使用]
  • find_last_not_of
    与find_first_not_of相似,区别在于find_last_not_of是从后往前找


其他功能性函数

替换replace

replace
replace函数,可以替换字符串中一段,有多种重载形式
C++ [STL之string的使用]


交换swap

swap
string内置了交换函数也支持库函数进行交换!


截取字符串substr

substr
substr支持从pos下标(默认为0)截取len个字符并重新构造一个string对象作为返回值
C++ [STL之string的使用]


字符串比较函数compare

compare
string拥有一个比较函数compare,这个用的很少,因为没有运算符方便!
C++ [STL之string的使用]



非成员函数

输入输出流

C++重载了operator <<>> 运算符,所以string类对象支持使用cin和cout进行流插入和流提取
这里需要注意的是cin流提取字符串时,是全覆盖式的写入字符串,cin输入字符串会覆盖以前的字符串!
C++ [STL之string的使用]


获取一行字符串(包括空格)

getline函数支持一次截取一行字符串,碰到换行截至,这个函数在需要空格输入时非常实用!
其参数为cin和string对象
C++ [STL之string的使用]


比较运算符重载

C++重载了字符串比较运算符,所以string拥有自己的比较规则
C++ [STL之string的使用]


operator + 运算符

这个+运算符比较特殊,将两个字符串拼接以一个新的string对象作为返回值
C++ [STL之string的使用]
C++ [STL之string的使用]


最后

string的使用介绍到这里就介绍了,可以发现前辈们为了能自由自在摆弄字符串也是煞费苦心,好在字符串的操作在string的加持下确实非常方便,本文介绍了大部分接口,但是并非全部常用,想要掌握string还得平时多用并结合 string文档 加以升华!

本次 <C++ string使用> 就先介绍到这里啦,希望能够尽可能帮助到大家。

如果文章中有瑕疵,还请各位大佬细心点评和留言,我将立即修补错误,谢谢!
C++ [STL之string的使用]

🌟其他文章阅读推荐🌟
C++ <模板> -CSDN博客
C++ <内存管理> -CSDN博客
C++ <类和对象 - 下> -CSDN博客
C++ <类和对象 - 中> -CSDN博客
C++ <类和对象 - 上> -CSDN博客
🌹欢迎读者多多浏览多多支持!🌹

​​

​​


文章来源地址https://www.toymoban.com/news/detail-428530.html

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

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

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

相关文章

  • C++ STL string类

    目录 一.为什么学习string类 (1) C语言中的字符串 (2)标准库里面的string类 二. string类的常用接口说明 (1)string类对象的常见构造 (2)string类对象的容量操作 1.size(),length(). 2. capacity() 3.empty()  4.clear()  5.reserve()  6.resize() (3)string类对象的访问及遍历操作  1.operator[ pos

    2024年02月13日
    浏览(35)
  • 【C++】STL——string类详解

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸C++  🛹Linux 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸君一同

    2024年02月11日
    浏览(42)
  • C++ STL string类模拟实现

    目录 string类成员变量 一.构造函数 二.析构函数 三.拷贝构造 四.size(),capacity() 五.operator [ ] 六. operator =  七.字符串比较  八.reserve() 九.push_back(),append() 十.operator+=  十一.insert()  十二.迭代器  十二.erase() 十三.swap()  十四.find() 十五.流提取,流输出 十六

    2024年02月14日
    浏览(53)
  • C++ [STL之string模拟实现]

    本文已收录至《C++语言》专栏! 作者:ARMCSKGT 前面我们介绍了STL容器string的部分接口使用,有了string使我们对字符串的操作如鱼得水,其实string不止于使用方便,其实现也有许多我们值得学习的地方,本节将为您介绍string常用接口的代码实现! 本文接口的实现借助于C++官方

    2024年02月05日
    浏览(50)
  • 【C++ • STL】探究string的源码

    ヾ(๑╹◡╹)ノ\\\" 人总要为过去的懒惰而付出代价 ヾ(๑╹◡╹)ノ\\\" 浅拷贝 :也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,

    2024年02月08日
    浏览(42)
  • 【C++】STL之string类(1)

    个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C++之路】💌 本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长,共同进步。🍓 接下来就开始STL部分的学习了,本文先来学习一下

    2024年02月11日
    浏览(39)
  • C++STL详解 string【C++】

    函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器 在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比

    2024年02月08日
    浏览(55)
  • 【C++】STL之string类(2)

    个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C++之路】💌 本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长,共同进步。🍓 reverse :在不改变字符串内容的前提下,预留一定的

    2024年02月12日
    浏览(38)
  • 【C++】STL——string(两万字详解)

    🎇C++学习历程:STL——string学习 博客主页: 一起去看日落吗 持续分享博主的C++学习历程 博主的能力有限,出现错误希望大家不吝赐教 分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记,树🌿成长之前也要扎根,也要在漫长的时光🌞中沉

    2024年01月25日
    浏览(44)
  • 【C++精华铺】9.STL string

    目录 1. string类的优势 2. string类的常用接口 2.1 常用构造 1. 空串构造:string(); 2. C串构造:string(const char* s); 3. 拷贝构造:string(const string str); 4. 字符填充构造:string(size_t n, char c); 5. 迭代器构造:string(InputIterator first, InputIterator last); 2.2  string容量操作 1. size_t size(),size_t length

    2024年02月11日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包