string类是表示字符序列的类,并添加了专门用于操作单字节字符串的设计
图为string常用接口。
string的常用接口模块
- string的构造
- 容量操作
- 元素访问操作
- 元素修改操作
- 关于字符串特殊操作
- 迭代器
1.string的构造
string的4种常见的构造方式 string()
string(const char*)
string(size_t , char)
string(string)
#include <iostream>
using namespace std;
#include <string>
int main()
{
string s1; //普通的无参构造
string s2("hello world"); //带参构造,s2初始化
string s3(10,'a'); //s3 为 10 个重复的字符 'a'
string s4(s3); //s4 拷贝构造 s3
return 0;
}
2.容量相关操作
1.size() 与capacity()
size()表示当前容器有效元素的个数 capacity()表示当前容器的总大小string s("12345");
s.size(); //此时有效元素个数为 5
s.capacity();//此时容量为 15
s.clear(); //清空所有有效元素
s.size(); //此时有效元素个数为 0
s.capacity();//此时容量还是 15
s.clear()只清空有效字符,底层容量的大小不变
2.resize() 与reserve()
resize(n)修改当前有效元素的个数到n个
1.如果n小于现有元素个数,则将n个后元素舍去
2.resize(n,char c)如果n大于现有个数,则超出的部分用字符c填充
string s("12345");
s.resize(10,‘?’);//往后添加 5个? 最终的字符串为 12345?????
s.resize(3); //缩小到 3个元素 最终字符串 123
resize修改的是有效元素个数,不会修改底层容量的大小,但如果对字符串后填充操作时,如果超过当前底层容量的大小,则底层字符串容量会自动扩容1.5到2倍
reserve(n)修改底层容量的大小,不影响有效元素的个数
string s("12345");
s.reserve(20); //此时 capacity为 31
s.reserve(10); //此时 capacity为 15
reserve(),如果对容量进行扩充,修改的容量不一定与给定的容量相同,容量的改变有自己的修改机制。
如果对容量进行缩小,该函数不会执行,除非容量小于15时,返回15
3.元素访问和修改操作
1.下标访问与a()
与数组用法相同,通过[ ] 可以访问下标位置的元素 或者通过at(),访问相应位置的元素string s("abcde")
s[1]; //访问字符 'b'
s[0] = '1'; //通过赋值修改相应下标位置的元素
s.at(2); //访问字符 'c'
二者如果访问越界都会发生异常。但异常处理不相同,下标访问越界,出发assert断言,at()访问越界,抛出out_of_range异常
2.push_back(),append()添加元素
同样都是尾插元素push_back() 只能向后添加一个char类型字符.
append(),运算符+=,都能向后添加char,或是追加c风格的const char*字符串,以及string类型字符串。
string s1;
s1.push_back(‘I’);
s1+=" Love "; //此时s1内容为 "I Love "
string s2("you");
//s1向后追加string类字符串s2
s1+=s2; //此时s1的内容为 "I Love you" s2还是"you"
s1.append(1,',');// 向后添加一个 字符 ','
s1.append("abc"); //向后追加c风格的字符串
追加的有效元素一旦超过当前的底层容量大小,则string类会对容量进行自动扩容,扩容机制按照大概1.5倍扩容
3.insert()插入元素
可以在指定位置插入 char类型字符, const char*字符串, string类型字符串。string s("abcde");
s.insert(2,'0'); //在下标2后插入字符'0' s为"abc0de"
4.c_str()转换为C风格字符串
string内部c_str() 可以将当前 string类型字符串转换为C风格的 const char*字符串。string s("12345");
//atoi函数可以将字符串中的数字转换为相同的整形
int ret = atoi(s.c_str); //使用atoi需将 string类转化为C风格字符串
5.find()和rfind()查找元素
find() 从起始位置开始找需要查找的元素,并返回查找后匹配的第一个位置rfind()从最后的位置开始查找。如果位找到则返回npos
string s("hello world");
size_t pos = s.find(' ' );
if(pos!= string::npos)
{
cout<<pos;//返回查找到的第一个元素
}
pos = s.find("world"); //也可以查找string类型的元素
//应用find() 寻找文件后缀 abc.txt
string s2("abcde.txt")
pos = s2.rfind('.') + 1; //pos位置后就是后缀的位置
6.substr() 截取字符串
传递两个参数,第一个参数为,从字符串哪个位置开始截取第二个参数为,向后截取多少位,默认截取到字符串末尾
string s2("abcde.txt")
pos = s2.rfind('.') + 1; //pos位置后就是后缀的位置
string s3;
s3 = s2.substr(pos,3); //从pos位置向后截取3位,取得后缀
4.迭代器
迭代器可以当作指针理解。string::iterator1.循环遍历string中元素的3种方法
string s("hello");
//通过for each循环
for(auto e:s)
{
cout<<e;
}
//通过s.size()获取长度
for(int i = 0;i<s.size();i++)
{
cout<<s[i];
}
//通过iterator迭代器
string::iterator it = s.begin(); //从s起始位置开始
while(it!=s.end())
{
cout<<*it;
it++;
}