C++ string类常用接口

Posted 两片空白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ string类常用接口相关的知识,希望对你有一定的参考价值。

目录

前言

一.string类的常用接口

1.1 string类对象的构造函数

 1.2 string对象的容量函数

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

1.4 string类修改操作

 1.5 string 非成员函数


前言

        在C语言中,字符串是以'\\0'结尾的一些字符的集合。为了操作方便,C语言中还提供了一些控制字符串的函数例如strcpy,strcmp,strcat等等。但是这些函数与字符串是分离开的,并不符合C++封装的特性。于是C++中由单独产生了一个string类。

说明

        string是一个类,string实例化的对象实际是一个字符数组。

        在string类使用时,必须包含#include<string>头文件和展开命名空间using namespace std。

下面介绍string类的一些常用接口,大部分都是string类的成员函数。如果由什么下面没有提到的接口或者不明白的可以查文档http://www.cplusplus.com/reference/string/

一.string类的常用接口

1.1 string类对象的构造函数

函数名称功能说明
string()无参默认构造函数,构造空string类对象,即空字符串
string(const char * s)用c字符串构造string类对象
string(size_t n,char c)实例化的类对象中包含n个字符c
string(const string& s)拷贝构造函数,将对象s拷贝构造一个新对象

 1.2 string对象的容量函数

函数名称功能说明
size()返回字符串中有效字符长度
length()返回字符串中有效字符长度
capacity()返回空间的总长度,字符长度size超过capacity会自动扩容
empty()检测字符串是否为空串,是返回true,不是返回false
clear()清空有效字符串,空间不释放,内容没改变,只是size变为0
reserve(size_t n=0)为字符串预留空间,就是提前开辟一段你想要大小的空间,如果不用reserve,编译器会自己开辟一段空间。

resize(size_t n,char c)

将有效字符串个数改成n个,n小于size,缩小size到n。n大于size,增大size到n,多出来的空间用字符c填充,不给c,用'\\0'填充

 注意:length和size底层实现是一样的,引入size的原因是为了与其它容器保持一致,一般情况下用size。

 clear()函数只是将对象的size置0,不改变底层空间大小。

 resize(size_t n,char c),当n小于对象size时,直接改变对象的size到n。当n大于对象size时,直接增大对象size到n,多出来的空间用给的字符c填充,没给字符c默认用\\0填充。

 reserve是提前将对象capacity空间直接开辟到某一值。如果reserve里的值开辟空间小于capacity值,不会改变capacity。size始终都不会改变。

为什么上面代码reserve(50),会扩容到63。因为字符保存时存在一定的内存对齐,一般时某一值的正数倍。

这样看下面一个代码:

 如果提前知道套插入多少字符,提前开辟空间,防止扩容效率损失。

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

函数名称功能说明
operator[](size_t pos)[]操作符重载函数,返回pos位置字符
begin()获取第一个字符位置的迭代器
end()获取最后一个字符下一个位置的迭代器
rbegin()和end一样
rend()和begin一样
范围forC++11支持的一种更简洁的范围for的新遍历方式

说明: 

  1. 因为重载了[]操作符,可以直接用对象+[],就像数组的形式访问字符。
  2. 迭代器现在的理解:string类里含有一个迭代器,所以定义一个迭代器要声明是string类里的,begin和end返回的是迭代器,可以用迭代器接收或者作比较。有不足请提出。

1.4 string类修改操作

函数名称功能
push_back(char c)在字符串尾插字符
append(const char * s)在字符串尾插字符串
operator+=(常用)在字符串尾插字符或字符串
c_str返回c格式字符串
find(char c,size_t pos)在字符串pos位置开始往后找字符或字符串,返回该字符在字符串中第一次出现位置,不输入位置默认从开始往后找
rfind在字符串pos位置开始往前找字符或字符串,返回该字符在字符串中第一次出现位置,不输入位置默认从后往前找
substr(size_t pos,szie_t len)在字符串中从pos位置开始,截取len个字符,然后返回
nposstring的静态成员变量,static const size_t npos=-1;全1,size_t为无符号整形,实际40几亿

 push_back在字符串后尾插字符,append在对象后尾插字符串,+=重载即可尾插字符又可尾插字符串,所以常用+=。

 这样看不出什么不同,但是看下面这样。

由于c语言字符串以\\0结尾所以ret只打印了hello,但是打印对象也没有将\\0打印出来,这是因为有的字符在输出框是不可见的\\0就属于不可见的。

 

 补充:

函数名称功能
insert(pos,char * s)在pos位置插入字符或者有效字符串
erase(pos,n)在pos位置删除n个字符

 1.5 string 非成员函数

函数功能
operator+一对象加上字符或者字符串,返回一对象,对象自身不改变。少用,返回不是引用。效率低
operator<<输出操作符重载函数
operator>>输入操作符重载函数
getline(cin,对象)获取一行字符,包括空格。
relational operators (string)比较大小

cin输入遇到空格,换行结束。getline遇到换行结束。

以上是关于C++ string类常用接口的主要内容,如果未能解决你的问题,请参考以下文章

C++ 之string类常用接口功能解析(7千字长文带你玩懂string!)

[ C++ ] string类常见接口及其模拟实现

C++ STL string 详解

《c++从0到99》七 STL之string类

《c++从0到99》七 STL之string类

《c++从0到99》七 STL之string类