【C++】string介绍

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

【C++】string介绍

前言

这篇博客讲的是STL中的string,作为一名C++程序猿,搞懂STL可是非常重要的。这篇博客就是介绍一些string类中比较常用的函数。但重要的不是这,因为记住所有的函数接口是不可能的,而且重要的函数接口就几个。重要的是让大家培养出查文档的习惯。

string类中成员变量大概长这样,其实就是一个专门放字符串的顺序表,不过是库里面给你提供了一个现成的,不需要你自己去实现:

【C++】string介绍
这里的size和可不是sizeof()中的那个理解了。size就是有效字符的个数。这里是hello这五个。
上面的图留个印象,可以帮助了解string类。

为什么学习string类?

C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。不是很方便。

C++中有string类来提供各种各样的函数接口,大大提高了办事效率。

学了数据结构的同学,简单理解string类的话,其实就相当于是存放数据类型为char的顺序表。

函数接口有很多,我这里给出相应的网站供大家参考:STL中string参考文档,里面是英文的,读起来比较费劲的话我也没什么办法。

简单说几点,看不懂没关系,刚接触肯定不能完全理解的,我刚学的时候也不懂。

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

关于编码的东西,我直接给出大家一篇文章:刨根问底之——什么是编码?
感兴趣的可以自己看看,不过重点不在这。
要记住一点就是不同的编码中,一个字符可能占用不同的字节数。
比如utf-8一个汉字占用3个字节,utf-16一个汉字占用2个字节,utf-32一个汉字占用4个字节。

  1. 不能操作多字节或者变长字符的序列。

string类的常用接口说明

只讲常用的接口,如果想要自己拓展,可以查看文档,

string类对象的常见构造

先看一下提供了几个构造:
【C++】string介绍

总共七个构造,很多,但常用的就两三个。上面图中标上序号为1,2,4的记住就行。剩下的我待会给出用法,不需要记,等到写程序的时候需要某种功能的时候,去这里面查查就行。

上例子:

标号为1,2,4的。

1 string();
2 string (const string& str);
4 string (const char* s);

【C++】string介绍
上面cout能直接打印string类对象,是因为库中也有重载operator<<函数。
【C++】string介绍

标号为3的。

string (const string& str, size_t pos, size_t len = npos);

这个函数功能是从string类对象str中的pos位置开始,往后len个长的字符作为某个string对象的初始值。
【C++】string介绍
当len超过了能够初始化的有效字符长度或者没有给len值的时候会直接将pos后面全部作为初始化的内容。

len过大:
【C++】string介绍

未给len(len为缺省参数npos的时候):
【C++】string介绍
npos的值为-1:
【C++】string介绍
上面第一句话就说了npos是string类中的一个静态成员常量。固定为-1。

当len以无符号整型size_t接收-1的时候,-1以补码的形式给了len,len会接收到一个非常大的数,有42亿多,就是二进制全1的情况(如果不懂去了解一下整数的存储规则),其实也就相当于是len过大的情况。因为基本不可能出现一个42亿字节大小的字符串,也就是4G左右的大小。

标号为5的

string (const char* s, size_t n);

这个函数是将常量字符串s中前n个字符作为对象初始化的值。
可以这样用:
【C++】string介绍

也可这样用:
【C++】string介绍
这里的c_str后面会讲,这里先不说。

标号为6的

string (size_t n, char c);

这个函数将类对象的初始化字符串设置为n个字符c。
【C++】string介绍
最后一个先不说,用到迭代器了,等会讲迭代器的时候再说。

析构函数

这个没啥讲的,自动调用的东西。

赋值运算符重载

【C++】string介绍
库里提供了三个,1,2重要,但挨个说一下。

第一个和第二个放一块:

string& operator= (const string& str);
string& operator= (const char* s);

上例子:
【C++】string介绍
第三个:

string& operator= (char c);

【C++】string介绍

再说个这个:
【C++】string介绍
上面的几个初始化,都是调用的构造函数,只有最后一个赋值才是赋值运算符重载,初始化时不管用没用=,都不是调用赋值运算符重载。编译器做了优化。
这个在我前面类和对象中的博客也讲了,不懂的可以看看:类和对象下,看explicit关键字那里就行
最下面那个才是赋值运算符重载。中间蓝色框框住的是调用对应函数时,反汇编中函数的地址,右边绿色的是调用的函数。

[ ] 重载

这个[ ]的重载,对于字符串来说非常有用,可以向数组一样来访问字符串中的任意位置字符。

【C++】string介绍
例子:

访问任意位置:
【C++】string介绍

遍历字符串
【C++】string介绍

可以看到,库里面给了两个,还有一个const修饰的。
意思就是假如用string创建出的const的对象,这个对象是不能被修改的,此时再使用[ ]重载就会调用const修饰的[ ]重载。
来例子:
【C++】string介绍
此时就只能用来访问了,也就是只读的。
【C++】string介绍

[ ]会自动检查越界的情况。
【C++】string介绍

还有一个能随机访问的。
【C++】string介绍

看下例子:
【C++】string介绍
不过用起来没有[ ]那么方便,这个也是提供了有const修饰的函数的。
这个at和[ ]的区别就是,用at越界了之后是抛异常,[ ]是程序直接崩溃。

可以看到上面那张图中,for循环中我用到了s1.size()这个函数,讲讲这个。

size和length

【C++】string介绍
库里提供了这两个。
二者表示的是一个意思,只不过当初STL还没出的时候string已经出了,没出STL的时候用的是length表示string中有效字符的个数,后来除了STL之后,为了跟STL中其他的容器看齐才加的size,因为别的容器中都用的是size来表示元素个数,所以后来也给string中加上了这个size,用来表示有效字符个数。

那么上面的那个例子就好理解了。s1.size()就相当于是字符串的长度。

这里再把lenth给出:
【C++】string介绍
一模一样。

迭代器

这个就要重点说了。

先看长啥样:
【C++】string介绍

其中stirng::iterator就是迭代器,s1.begin()就是迭代时的初始位置,s1.end()就是迭代的末尾位置,就相当于是首元素的地址和末尾有效元素的地址。

这个用法是死的,毕竟语法就是这样,没法改,只能记住。

迭代器用起来就像是指针,但是有的容器中iterator用的是指针,有的就不是。
string和vector(顺序表)中的迭代器其实就是指针实现的。
其他的就不是指针了。

但是在string和vector中不习惯用iterator,因为可以直接用[ ]来访问元素,用iterator反而麻烦了。

list/map/set…只能用iterator来访问,用法也是类似的。

这里给出list(链表)中使用iterator的例子:
【C++】string介绍
注意循环里面的 it++,我刚学的时候老是忘记。
可以看到,我们用C语言写的链表可没有这样的功能,只能是next来找下一个节点。所以说C++学STL是很有必要的,会方便很多。

上面的是正向的迭代器,还有反向的迭代器。
叫做reverse_iterator,对应的头和尾也要改成rbegin和rend。
【C++】string介绍

不仅有正反向还有const修饰的对象。
【C++】string介绍
像上面的一样,也是const对象就调用的是const修饰的begin和end。
把例子给出:
正向+const
【C++】string介绍

反向+const
【C++】string介绍

如果觉得写迭代器比较麻烦的话,可以用auto来替代它,auto可以自动识别类型,这个在我的第一篇C++博客当中也是说了的,感兴趣的可以看看直接看最后的auto就行 。
还是给例子:
【C++】string介绍
这时候不管有多长的类型,都可以直接用auto来替换,写起来就比较方便了。

提到auto了就说一下范围for。
给例子:
【C++】string介绍

看起来很🐂,其实范围for底层就是用迭代器来实现的。

迫于vs2019下反汇编看起来二者相似度不大,但我又我没法展示出来更为相似的地方,但反汇编还是有些地方是相似的。
【C++】string介绍
【C++】string介绍
用vs2013可能更好观察一点。

迭代器就说到这。

下面把前面的构造函数的最后一个演示一下:

template <class InputIterator>
  string  (InputIterator first, InputIterator last);

上面的InputIterator first和InputIterator last这两个,其实传的就是迭代器。
【C++】string介绍
参数中 s1.begin() 和 s1.end() 可加可减。
【C++】string介绍【C++】string介绍

字符串追加

有三种用法。
第一种是push_back接口。
第二种是append接口。
第三种是+=接口。
【C++】string介绍

挨个演示

push_back
【C++】string介绍
加单个字符
【C++】string介绍

append
【C++】string介绍

展示几个,其实和构造函数里的一模一样那几种情况一模一样。

string& append (const string& str);

【C++】string介绍

string& append (const string& str, size_t subpos, size_t sublen);

这个和构造函数里面的那个很相似。
正常情况:
【C++】string介绍
sublen太大:
【C++】string介绍
不给sublen:
【C++】string介绍

string& append (const char* s)

【C++】string介绍

演示下迭代器,剩下的两个就不说了,跟构造函数里的用法一样。
【C++】string介绍

然后就是+=了
【C++】string介绍
这个用起来会比前两个方便很多。

演示一下:
【C++】string介绍
所以前两个方法只是为了演示一下,不建议用,真要用的话用+=就行,很方便。

关于容量的函数

前言部分,给了这张图:
【C++】string介绍
capacity函数可以返回string对象的容量
【C++】string介绍

预开空间reserve:
【C++】string介绍
这个函数会将_capacity开到n(或者更大)。不会初始化string对象中的内容。
最后开的_capacity的大小在不同的系统下是不一样的,vs下是这,g++下就不是这个了,会直接开为100。
【C++】string介绍
里面啥也没放:
【C++】string介绍

预开空间并初始化resize:

【C++】string介绍
这个函数会将_capacity开到n,并且会将size的大小改为n,然后将前n个初始化为c,如果没给c,则初始化为0。
【C++】string介绍
看以看到size变为了100,capacity变为了111。

string的扩容机制在vs2019下有点怪:
我用下面的代码进行string类对象的扩容观察:

string s1;
	cout << "init size::" << s1.size() << endl;
	int capacity = s1.capacity();
	cout << "init capacity::" << s1.capacity() << endl;
	int count = 1000;
	while (count)
	{
		s1 += 'h';
		if (capacity != s1.capacity())
		{
			cout << "capacity changed ::" << s1.capacity() << endl;
			capacity = s1.capacity();
		}
		count--;
	}

在vs2019下:
【C++】string介绍
可以看到大概是1.5倍的扩。
而且如果用reserve的话,也不是给定的capacity值。
【C++】string介绍

但是g++下就不一样了:
同样的代码放到g++下:
【C++】string介绍
运行:
【C++】string介绍
得到的结果就是100,不是vs2019下的111。

再看一下扩容的情况:
【C++】string介绍
这里能看到,g++下是2倍的扩的。

就是给大家演示一下,不同编译器下的结果可能是不一样的。

再演示一下resize缩小size的情况:
【C++】string介绍
上面resize(5),会将hello world!!!中的 world!!!全部劈掉,只剩下hello。
【C++】string介绍

insert和erase

先看inseret:
【C++】string介绍

其实参数和上面的构造等非常相似,都跑不开string对象,常量字符串,单个字符。

string& insert (size_t pos, const string& str);
//插string对象

string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
//插string对象的sobpos位置处的后sublen个字符

string& insert (size_t pos, const char* s);
//插常量字符串

string& insert (size_t pos, const char* s, size_t n);
//插常量字符串的前n个字符

string& insert (size_t pos, size_t n, char c);
//插n个字符c

上面的都是从pos位置插入,只不过是前插。
放一块演示一下:
【C++】string介绍
剩下的就不说了。

然后是erase
【C++】string介绍
就说第一个。
从pos位置开始,删除npos个字符。

默认情况下全删
【C++】string介绍
给上参数:
【C++】string介绍

insert和erase不建议多用,因为二者都可能存在挪动数据的情况,效率比较低。

find

【C++】string介绍
上面都是找字符(串),找到了返回下标,找不到返回npos。

//从pos位置开始找str
size_t find (const string& str, size_t pos = 0) const

【C++】string介绍

//从pos位置开始找s
size_t find (const char* s, size_t pos = 0) const;

【C++】string介绍

//从pos位置开始找s的前n个字符,很鸡肋,不如第二个
size_t find (const char* s, size_t pos, size_t n) const;

【C++】string介绍

//从pos位置开始找字符c
size_t find (char c, size_t pos = 0) const;

【C++】string介绍
这里注意,找的永远是从pos位置往后的第一个c。

给道例题:将下面字符串中空格替换为字符串:::

hello world I am xxx

也就是换成:

hello:::world:::I:::am:::xxx

第一种方法:结合前面的insert和erase

【C++】string介绍
具体的就不讲了,注意画图理解。

第二种方法:空间换时间
【C++】string介绍

还有一个函数replace,听名字就是替换。

replace

【C++】string介绍

string& replace (size_t pos,  size_t len,  const string& str);

将string对象的pos位置往后的len个字符替换为str。

给几个例子:
0位置往后的2个字符换为tmp
【C++】string介绍
0位置往后的3个字符换为tmp
【C++】string介绍
0位置往后的1个字符换为tmp
【C++】string介绍
0位置往后的2个字符换为tmp
【C++】string介绍

然后也能用这个来搞前面那道例题了:
【C++】string介绍

然后replace的就不讲了,感兴趣的自己可以查文档。

但是如果想要找到最后一个单词呢?
可以用rfind。

c_str

这个比较有用,就是将string类对象中的字符串以常量字符串的形式返回。也就是将C++中的类对象转换为C中的常量字符串。
【C++】string介绍
其实二者没什么区别。区别都是C++和C的语法使用上的。
【C++】string介绍
但是有一个场景要注意:
C++中打印字符串是以字符串本身的size来决定打印多少的。
而C中的打印是以’\0’为结束标志的。
【C++】string介绍
就记住这个就行。

rfind

这个就是倒过来找的意思。reverse find。
【C++】string介绍

然后就可以做上面的那道题了:
【C++】string介绍

还是不细讲,用的时候查文档就行。

find_first_of

这个函数名字起得不好,应该叫find_any_of,这个函数用法是找到字符串里任意一个字符第一次出现的位置。
【C++】string介绍
例子:
【C++】string介绍
这里的2就是hello中的第一个 l 的下标。
【C++】string介绍
【C++】string介绍
这里的用法是从第五个位置开始找,找到oI中的任意一个。

find_first_not_of

找到对象中第一个没有出现字符串中字符的位置。
【C++】string介绍

【C++】string介绍

不细讲。

find_last_of

找到最后出现的。
【C++】string介绍
其实就是倒着找。
【C++】string介绍

substr

这个函数是帮忙取出子串的。
【C++】string介绍

直接给例子:
【C++】string介绍
取出下标为3位置处的后4个字符

再来个例子:将网址的协议、域名、后面的分开打印出来。

网址都是死格式:

protocal://hostname:portname/pathname/?search#hash
就先找://,搞成字串
再找/,搞成字串
后面的再搞成字串就OK了

我就以我现在所编写的网址为例:
【C++】string介绍

getline

还有一个比较重要的东西,就是getline,相当于C语言中的fgets。
就是获取一行字符串。
【C++】string介绍
有的同学可能会说为啥不直接用cin呢?
看:
【C++】string介绍
cin和scanf一样,遇到空格或者回车就会当成是字符串就结束了。

而getline和fgets(gets)就是C++和C中能够读取包含空格字符串的两个函数。

所以这里用getline就好了。
【C++】string介绍

to_string

这个也比较好用。

将数字转成字符串。
【C++】string介绍
这些所有参数的类型都能转换成string类型。
【C++】string介绍
C语言中的atoi没有这个好用。

还有字符串转数字的。
【C++】string介绍
【C++】string介绍

总结

剩下的没什么好讲的了,其实最常用的就是[] += 迭代器 size这几个常用点,剩下的留个印象就行,没必要全记住,其他的想用的时候忘了查文档就行。

到此结束。。。文章来源地址https://www.toymoban.com/news/detail-461568.html

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

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

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

相关文章

  • 【C++】:STL——标准模板库介绍 || string类

    STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且 是一个包罗数据结构与算法的软件框架 原始版本 Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商

    2024年02月05日
    浏览(58)
  • 【C++】String类基本接口介绍(多看英文文档)

    string目录 目录  如果你很赶时间,那么就直接看我本标题下的内容即可!! 一、STL简介 1.1什么是STL 1.2STL版本 1.3STL六大组件 1.4STL重要性 1.5如何学习STL 二、什么是string??(本质上是一个类) 三、string的类模板(什么?string居然利用了模板??) 三、string的三种构造(拷贝

    2024年02月07日
    浏览(40)
  • C++入门之stl六大组件--String库函数的介绍

    文章目录 一、为什么学习string类 1.C语言中的字符串 二、标准库中的string类 1.string类 2.string类的常用接口 1.string类对象的常见构造 2.string类对象的容量操作 3.string类对象的访问以及遍历操作 4.string类对象的修改操作 5.string类的非成员函数 总结   C语言中,字符串是以\\0结尾的

    2024年02月16日
    浏览(44)
  • [C++] string类的介绍与构造的模拟实现,进来看吧,里面有空调

    C语言中,字符串是以’\\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合面向对象的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。 因此C++中,为了让我们更简单、方便

    2024年02月12日
    浏览(39)
  • 如何在C++中将int类型的变量转换为string类型呢?今天我们就来介绍两种方法。

    如何在C++中将int类型的变量转换为string类型呢?今天我们就来介绍两种方法。 第一种方法是使用C++11标准引入的std::to_string()函数。这个函数可以将数字类型的变量转换为对应的字符串类型。下面是一个使用示例: 上面的代码将整型变量num转换为字符串类型,并输出到控制台

    2024年02月08日
    浏览(57)
  • 【C++】手撕string(string的模拟实现)

    手撕string目录: 一、 Member functions 1.1 constructor 1.2  Copy constructor(代码重构:传统写法和现代写法) 1.3 operator=(代码重构:现代写法超级牛逼) 1.4 destructor 二、Other member functions 2.1 Iterators(在string类中,迭代器基本上就是指针) 2.1.1 begin() end() 2.1.2  范围for的底层

    2024年02月08日
    浏览(45)
  • 《string类的使用介绍》

    本文主要介绍string的常见的接口的使用 字符串是 表示字符序列的类 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。 string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器

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

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

    2023年04月23日
    浏览(58)
  • [C/C++]string类常用接口介绍及模拟实现string类

            在C语言中,字符串是以\\\'\\0\\\'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。 C++中对于string的定义为: typedef ba

    2024年03月22日
    浏览(83)
  • String.format()方法的使用介绍

    String.format() 方法中的 % 符号用作占位符,用于将值插入字符串中。它用于使用特定值(例如整数、浮点数或字符串)格式化字符串。% 符号后面跟着一个字母,指定要插入的值的类型,例如 %d 表示整数,%s 表示字符串。要插入的值作为参数传递给 String.format() 方法。

    2024年02月16日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包