【C++】---了解string类

文章目录

  • string类和C语言的字符串区别
  • string类的常用接口
    • string类对象的常见构造方法
    • string类对象的容量操作
      • *size和length
      • capacity
      • *empty
      • *clear
      • *reserve
      • *resize
    • string类对象的访问及遍历操作
      • *operator[]
      • 迭代器
        • begin + end
        • rbegin + rend
        • 迭代器的使用
    • string类对象的修改操作
      • *operator+=
      • *c_str
      • *find + npos
      • *operator>> operator<<
      • *getline
    • 总结
  • vs和g++下string结构的说明
    • VS下的string
    • g++下的string
  • 总结

string类和C语言的字符串区别

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

string类是C++中表示字符串的字符串类,该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。通过调用接口来操作string的常规操作。string在底层实际是:basic_string模板类的别名,不能操作多字节或者变长字符的序列。

typedef basic_string<char, char_traits, allocator> string;

因此使用string类比使用字符集合的字符串更方便,底层编译器都已经帮我们实现好了,直接调用即可

string类的常用接口

string类对象的常见构造方法

【C++】---了解string类_第1张图片

跟一些常见的类一样,可以拷贝构造,无参构造,传值传参构造。

【C++】---了解string类_第2张图片

可以看到以上的构造都是可以成功地创造出string类的对象,我们只需要记住常见的即可,不常见的如果有需求再查文档。

string类对象的容量操作

*size和length

这两个没啥区别,都是返回字符串有效字符长度,不过按照使用C++的使用我个人更喜欢使用size。

【C++】---了解string类_第3张图片

【C++】---了解string类_第4张图片

看看运行的结果

image-20221104165210218

capacity

看到字面意思就知道是返回空间容量总大小,需要注意的是空间大小不一定等于有效字符长度

【C++】---了解string类_第5张图片

【C++】---了解string类_第6张图片

*empty

这个就是检测字符串释放为空串,是返回true,否则返回false,还是比较属于比较常见的

【C++】---了解string类_第7张图片

*clear

清空有效字符,什么意思呢。假设先有一个对象s1,它里面存的是“hello world”,那这时我调用clear接口就可以将里面的“hello world”清空,再次打印就看不到了。

【C++】---了解string类_第8张图片

【C++】---了解string类_第9张图片

*reserve

为字符串预留空间,也就是说这个接口是用来给string对象开辟空间的,但是会由于各个编译器底层的实现不同,因此可能会不是我们想指定的空间大小

image-20221104184634419

首先来看看在VS2022下会发生什么

【C++】---了解string类_第10张图片

可以看到,当我们一创建对象编译器就已经自动开辟了15个空间大小,当我们想扩容到20时,它直接就扩容到了31。

接下来看看Linux操作系统下的g++编译器

【C++】---了解string类_第11张图片

可以看到,g++中如果我们没有给对象赋初值,它是不会开辟空间的,使用reserve的效果就出来了

*resize

将有效字符的个数该成n个,多出的空间用字符c填充,如果我们想改成的长度小于字符串的长度就有点像可以选择长度的clear()了。如果想改的长度比字符串长度大,那它就会自动的扩容,并且会用参数的char进行填充。如果没有char参数,就默认为’\0’

【C++】---了解string类_第12张图片

【C++】---了解string类_第13张图片

效果就很明显了

string类对象的访问及遍历操作

*operator[]

返回pos位置的字符,const string类对象调用,这个就很好理解了,就跟数组和C语言里的字符串一样,可以随机访问。

【C++】---了解string类_第14张图片

【C++】---了解string类_第15张图片

迭代器

迭代器的使用就有点像指针,但它不一定是指针,具体的使用方法我们先来看看迭代器的一些接口

begin + end

begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器

rbegin + rend

反向的获取

迭代器的使用

下面来看看迭代器的使用方式

int main() {
	string s1("hello world");
	//首先创建一个string类迭代器指向第一个字符的迭代器
	string::iterator it = s1.begin();
	//遍历直到迭代器指向最后一个字符的迭代器
	while (it != s1.end()) {
		cout << *it << " ";
		it++;
	}

	return 0;
}

和指针的使用是类似的,那么如果想反向的去获取呢,迭代器就要变个名称了


int main() {
    string s1("hello world");
    
    string::reverse_iterator it = s1.rbegin();
    
    while (it != s1.rend()) {
        cout << *it << " ";
        it++;
    }
    
    return 0;
}

string类对象的修改操作

在这里就不说一些比较简单的了,例如push_back 那些的,下一篇文章讲模拟实现再写一下简单的底层原理

*operator+=

在字符串后追加字符串str,可以说push_back,append都不比这个用的多。想增加一个字符或者一个字符串直接+=搞定,也可以用于两个对象之间的追加

【C++】---了解string类_第16张图片

【C++】---了解string类_第17张图片

*c_str

返回C格式字符串,直接将string类的对象转换为C语言的字符数组类型

【C++】---了解string类_第18张图片

【C++】---了解string类_第19张图片

*find + npos

从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置,就是用来查找该字符串中的字符位置的

如果找到了,返回该字符在字符串中的位置;找不到则返回nops(由于其返回类型为size_t,所以就是最大的size_t)

【C++】---了解string类_第20张图片

【C++】---了解string类_第21张图片

还有一些rfing,find_first_of都是差不多的原理,可以自行查看文档了解

*operator>> operator<<

流输入和流输出重载是非常重要的,有了流输出重载我们才可以直接使用cout<<打印出整个字符串

【C++】---了解string类_第22张图片

【C++】---了解string类_第23张图片

【C++】---了解string类_第24张图片

*getline

上面讲的流输入当你去用的时候就会发现一些问题,如果你输入的字符串有空格就出现问题了

【C++】---了解string类_第25张图片

就像这样。这是我们就需要使用一个新的接口,getline:获取一行字符串

【C++】---了解string类_第26张图片

【C++】---了解string类_第27张图片

需要这样子才可以很好地将字符串输入

总结

还有很多的接口,比如比较大小写的系统也是帮我们底层实现好了直接使用即可。这里我就挑了一些常见的讲讲,如果有需要可以去查看文档,

cplusplus

vs和g++下string结构的说明

VS下的string

string总共占28个字节,内部结构稍微复杂一点,先是有一个联合体,联合体用来定义string中字符串的存储空间:

  1. 当字符串长度小于16时,使用内部固定的字符数组来存放
  2. 当字符串长度大于等于16时,从堆上开辟空间

这种设计有它的好处,因为大多数情况下字符串的长度都小于16,那string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高

g++下的string

G++下,string是通过写时拷贝实现的,string对象总共占4个字节,内部只包含了一个指针,该指针将来指向一块堆空间,内部包含了如下字段:

  1. 空间总大小
  2. 字符串有效长度
  3. 引用计数
  4. 指向堆空间的指针,用来存储字符串

总结

string算是学习的第一个容器了

相当于C语言而言确实方便了很多

之后学习STL更多容器就能感受到C++的更多魅力了

加油!!!!

你可能感兴趣的:(C++,c++,开发语言,数据结构)