C++ string类常用接口
Posted 两片空白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 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一样 |
范围for | C++11支持的一种更简洁的范围for的新遍历方式 |
说明:
- 因为重载了[]操作符,可以直接用对象+[],就像数组的形式访问字符。
- 迭代器现在的理解: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个字符,然后返回 |
npos | string的静态成员变量,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类常用接口的主要内容,如果未能解决你的问题,请参考以下文章