什么是string
string与vector非常相似,专门用于保存字符,随机访问快,在尾部插入或者删除都很快。
为什么需要string类?
C语言中,字符串是以‘\0’结尾的一些字符的集合,为了方便操作,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不符合OOP的思想,而且需要用户自己管理,稍不留神还可能产生越界访问。
String和c风格字符串对比
Char是一个指针,String是一个类,它封装了char ,由它来管理这个字符串,是一个char型的容器。 String封装了很多实用的成员方法,查找find,拷贝copy,删除delete 替换replace,插入insert。 不用考虑内存释放和越界,string管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。 但是唯一需要额外注意的是:使用string的时候必须包含头文件string以及using namespace std;
构造函数
函数名称 功能说明 string() 构造空的string类对象,即空字符串 string(const char *s) 用C-string来构造string类对象 string(size_t n, char c) string类对象中包含n个字符c string(const string &s) 拷贝构造函数 string(const string&s,size_t n) 用s中的前n个字符构造新的string类对象
容量操作
函数名称 功能说明 size_t size() const 返回字符串有效字符长度 size_t length() const 返回字符串有效字符长度 size_t capacity() const 返回空间总大小 bool empty() const 检测字符串是否为空串,如果是空返回true,否则返回false void clear() 清空有效字符 void resize(size_t n, char c) 将有效字符的个数改成n个,多出的空间用字符c填充 void resize(size_t n) 将有效字符的个数改成n个,多出的空间用0填充 void reserve(size_t res_arg = 0) 为字符串预留空间
结论:
size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。 clear()只是将string中的有效字符清空,不改变底层空间的大小 resize(size_t n)与resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时;resize用0来填充多出的空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。 reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserve会改变底层容量的大小。(windows与linux有区别,在linux下大于15的时候会分配对应的空间,而小于15的时候会是15。windows下第一次分配的内存会分配一次,直到减少到15个的时候才会变成15个)
访问操作
函数名称 功能说明 char &operator[](size_t pos) 返回pos位置字符的引用,非const对象调用 const char &operator[](size_t pos) 返回pos位置字符的引用,const对象调用 char& at(int n) 通过at方法获取字符
为了修改string字符串的内容,下标操作符[]和at都会返回字符的引用。但当字符串的内存被重新分配之后,可能发生错误. []与at的区别:[]访问越界直接挂掉,at会抛出异常。
拼接操作
函数名称 功能描述 string& operator+=(const string& str) 字符串后追加一个string string& operator+=(const char c) 字符串后追加一个字符 string& operator+=(const char* str) 字符串后追加一个c_string string& append(const char *s) 字符串后追加一个c_string string& append(const char *s, int n) 把字符串s的前n个字符连接到当前字符串结尾 string& append(const string &s) 字符串后追加一个string string& append(const string &s, int pos, int n) 把字符串s中从pos开始的n个字符连接到当前字符串结尾 string& append(int n, char c) 在当前字符串结尾添加n个字符 string& push_back(char c) 在当前字符串结尾追加字符c
在string尾部追加字符时,s.push_back()、s.append(1, c)以及s+='c’三种实现方式差不多,一般 使用+=,因为+=不仅可以连接单个字符,还可以连接字符串。
查找和替换
函数名称 功能描述 int find(const string& str, int pos = 0) const 查找str第一次出现位置,从pos开始查找 int find(const char* s, int pos = 0) const 查找s第一次出现位置,从pos开始查找 int find(const char* s, int pos, int n) const 从pos位置查找s的前n个字符第一次位置 int find(const char c, int pos = 0) const 查找字符c第一次出现位置 int rfind(const string& str, int pos = npos) const 查找str最后一次位置,从pos开始查找 int rfind(const char* s, int pos = npos) const 查找s最后一次出现位置,从pos开始查找 int rfind(const char* s, int pos, int n) const 从pos查找s的前n个字符最后一次位置 int rfind (char c, int pos = npos) const 查找字符c最后一次出现位置 string& replace(int pos, int n, const string& str) 替换从pos开始n个字符为字符串str string& replace(int pos, int n, const char* s) 替换从pos开始的n个字符为字符串s
插入与删除
函数名称 函数功能 string& insert(int pos, const string& str) 插入字符串 string& insert(int pos, const char* s) 插入字符串 string& insert(int pos, int n, char c) 在指定位置插入n个字符c string& erase(int pos, int n = npos) 删除从Pos开始的n个字符
比较操作
函数名称 函数功能 int compare(const string &s)const 与字符串s比较 int compare(const char *s) 与字符串s比较
compare函数在>时返回 1,<时返回 -1,==时返回 0。比较区分大小写,比较时参考字典顺序,排越前面的越小。
获取子串
函数名称 函数功能 string substr(int pos = 0, int n = npos) const 返回由pos开始的n个字符组成的字符串
string和c-style字符串转换
函数名称 函数功能 const char *c_str() 返回C格式字符串 string(char *s) 用C-string来构造string类对象
在c++中存在一个从const char到string的隐式类型转换,却不存在从一个string对象到C_string的自动类型转换。对于string类型的字符串,可以通过c_str()函数返回string对象对应的C_string. 通常,程序员在整个程序中应坚持使用string类对象,直到必须将内容转化为char 时才将其转换为C_string. 我们可以使用data函数获得不以null结尾的字符串。
非成员函数
函数名称 功能描述 operator+() 尽量少用,效率低 operator>>() 输入运算符重载 operator<<() 输出运算符重载 getline 获取一行字符串 relational operators 大小比较
void test07 ( )
{
string s;
getline ( cin, s) ;
cout << s << endl;
getline ( cin, s, 'a' ) ;
cout << s << endl;
}