标准库中的string类
string类
template<class T> class basic_string { private: T* _str; size_t _size; size_t _capacity; }; typedef basic_string<char> string;
string是表示字符串的字符串类
此类的接口与常规容器的接口基本相同,另外再添加一些专门用来操作string的常规操作
string在底层实际是:basic_string模板类的别名,typedef basic_string<char,char_traits,allocator>string
不能操作多字节或者变长字符的序列
使用string类时,需要包含头文件 #include和 using namespace std;
string类常用接口说明
string类对象的常见构造
函数名 | 功能 |
string() | 构造空的string类对象,即是空字符串 |
string(const char*s) | 用C-string来构造string类对象 |
string(size_t n,char c) | string类对象中包含n个字符c |
string(const string& s) | 拷贝构造函数 |
void test() { //构造空的string类对象 string s1; //用C字符串构造string类对象 string s2("hello crush"); //拷贝构造 string s3(s2); }
string类对象的容量操作
函数名 | 功能 |
size | 返回字符串有效字符长度(不包括’\0’) |
length | 返回字符串有效字符长度 |
capacity | 返回空间总大小 |
empty | 检测字符串是否为空串,是返回true,否则返回false |
clear | 清空有效字符 |
reserve | 为字符串预留空间 |
resize | 将有效字符的个数改为n个,多出的空间用字符填充 |
在学习容量操作前,先了解扩容的原理
void Testpushback() { string s; size_t sz = s.capacity(); cout << "capacity changed:" << sz << "\n"; cout << s.size() << endl; cout << "making s grow"; for (int i = 0; i < 1000; i++) { s.push_back('c'); if (sz != s.capacity()) { sz = s.capacity(); cout << "capacity changed:" << sz << "\n"; } } } void test() { Testpushback(); }
当容量不够时,string会自动进行扩容进行适配
区分size()和capacity()
size()计算的是字符串的有效长度;capacity()计算的是字符串的容量大小。两者在大小上是有所不同的
resize存在三种情况
n<11 删除数据
11<n<15 插入数据
15<n 扩容+插入数据
void test() { string s1("hello crush"); //删除数据 s1.resize(5); cout << s1.size() << endl; cout << s1.capacity() << endl; cout << s1 << endl << endl; string s2("hello crush"); //插入数据 s2.resize(15, 'x'); cout << s2.size() << endl; cout << s2.capacity() << endl; cout << s2 << endl << endl; string s3("hello crush"); //扩容+插入数据 s3.resize(20, 'x'); cout << s3.size() << endl; cout << s3.capacity() << endl; cout << s3 << endl << endl; }
string类对象的访问及遍历操作
函数名 | 功能 |
operator[] | 返回pos位置的字符,const string类对象调用 |
begin + end | begin获取第一个字符的迭代器,end获取最后一个字符下一个位置的迭代器 |
rbegin + rend | rbegin获取最后一个字符的迭代器,rend获取最后一个字符下一个位置的迭代器 |
范围for |
下标[]
void test() { string s1("1234"); //下标[] for (size_t i = 0; i < s1.size(); i++) { s1[i]++; } cout << s1 << endl; }
范围for
void test() { string s1("1234"); //范围for for (auto& ch : s1) { ch--; } cout << s1 << endl; }
注意这里的范围for需要使用引用,对s1本身进行修改
迭代器 行为上与指针一样
void test() { string s1("1234"); //迭代器 string::iterator it1 = s1.begin(); while (it1 != s1.end()) { *it1 += 1; it1++; } it1 = s1.begin(); while (it1 != s1.end()) { cout << *it1 << " "; it1++; } cout << endl; }