目录
1.STL
STL定义:STL是标准模板库,主要实现数据结构和算法。
六大组件:
2.string
1.string字符串
string也是一种模板。
服务于不同编码的标准下,不同字符串类的实现。
2.编码介绍
不同字符对应的其实是一串一串的01二级制,只要在某个规定下,符合一一对应,我们能通过01串找出对应字符,这样的规定就是编码。其中:ASCII码和Unicode码
ASCII:美国信息交换标准代码,解决字母和字符对应的标准码表
Unicode:万国码,将其他国家的字母符号或者字与01码一一对应
解决一一对应的方法:UTF-8,UTF-16,UTF-32
UTF-8:兼容ACSII;支持中文,将常见汉字用两个字节表示,生僻字通过变长字节来表示
UTF-16:不兼容ASCII,起步用两个字节表设计
UTF-32:起步用四个字节表设计
另外中国自己对汉字设计了一套编码:GBK
如果针对的编码是utf8使用string,utf16使用u16string,utf32使用u32string,wstring是宽字符的针对windows服务的。函数接口差不多,只是存储字符的编码表示不同。
3.string的使用
string模板的头文件在string中,命名空间都是std。
#include<string>
1.string的构造函数
void Test1()
{
string s1; //1.空数组
cout << "s1:" << s1 << endl;
string s2_1("abcdefg"); //2.有参数构造
cout << "s2_1:" << s2_1 << endl;
string s2_2 = "xyz"; //2.拷贝构造+构造的类型强转
cout << "s2_2:" << s2_2 << endl;
string s3(s2_1, 2, 4); //3.拷贝另一个字符串的某个范围
cout << "s3:" << s3 << endl;
string s4_1(s2_2); //4.拷贝构造
string s4_2 = s4_1; //4.拷贝构造
string s5(10, '*'); //5.构造多个相同的字符
string s6("hello world", 5); //6.前几个字符中取
cout << "s6:" << s6 << endl;
}
遍历方式
void Test2() { string s1("1234"); //1.遍历下标[] for (size_t i = 0; i < s1.size(); ++i) s1[i]++; //2.遍历范围for for (auto& ch : s1) ch--; //3.迭代器 string::iterator begin = s1.begin(); while (begin < s1.end()) { cout << *begin; begin++; } }
2.string的迭代器
迭代器是类似于指针的东西;使用起来也和指针访问差不多,迭代器是通用的访问形式,STL中的其他容器都可以用迭代器的形式来访问
类型:string::iterator
begin():开头第一个字符
end():字符串的末尾\0
begin() +到 end(),顺序往后
类型:string::reverse_iterator
rbegin():字符串的末尾前一个字符
rend():字符串最前面的前一个字符
rbegin() +到 rend(),顺序往前
类型:string::const_iterator / string::const_reverse_iterator
该类型针对于const修饰的,string里的内容不能写;
void Test3(string& s) { string::iterator it = s.begin(); while (it < s.end()) { *it += 1; cout << *it << " "; it++; } cout << endl; string::reverse_iterator rit = s.rbegin(); while (rit < s.rend()) { *rit -= 1; cout << *rit << " "; rit++; } cout << endl; } void Test4(const string& s) { string::const_iterator it = s.begin(); while (it < s.end()) { cout << *it << " "; it++; } cout << endl; string::const_reverse_iterator rit = s.rbegin(); while (rit < s.rend()) { cout << *rit << " "; rit++; } cout << endl; } int main() { string s = "1234"; Test3(s); Test4(s); return 0; }
c++11提供:cbegin()、cend() / crbegin()、crend();
以只用于被const修饰的string
3.string容量相关
1.长度
size() / length():功能都是字符串的长度
void Test5() { string s = "hello world"; cout << s.size() << endl; cout << s.length () << endl; }
2.总空间大小
capacity()
void Test5() { string s = "hello world"; cout << s.capacity() << endl; }
3.清理相关
clear():把字符串的数据清空(至于总空间大小是否被清除取决于编译器)
empty():判空
4.缩减容量
shrink_to_fit():把容量降低
5.改变大小和容量
resize():改变字符串内容的大小,如果空间不够会影响空间大小
reserve():改变空间大小,起扩容作用,对字符串的大小不会修改
4.string的位置搜索
[ ]:通过数组的形式找字符串元素的位置,越界报错
at:获取指定位置的地址,找不到抛异常
front:第一个元素的位置
back:最后一个元素的位置
5.string的修改操作
push_back:尾插一个字符
append:尾插字符串
+=:运算符重载,尾插字符串
insert:在某个位置插入
erase:在某个位置删除
如果传入的删除数多了,那么有多少删多少。
insert和erase最好少调用,因为从实现代码角度,他们不仅仅加或者删了东西,还改变了其他内容的位置,其时间复杂度为O(N^2),降低效率所以不推荐
assign:全部清空,替换赋值
replace:替换
assgin和replace;一个是全部替换,一个是部分替换
replace不建议多用,理由和insert、erase一样,效率太低
6.string operation
c_str:返回底层指针
find:找到字符串的第一个指定字符,如果找不到返回string::npos
rfind:倒着找对应字符
substr:取子字符串
<<:流插入
>>:流提取