1.什么是STL?
标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
- 🔥标准模板库是一个C++软件库、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
- 🔥标准模板库是一个C++软件库类库的同时,保有了更大的可扩展性。
1.1STL的缺陷:
- STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出
- 来已经相隔了13年,STL才进一步更新。
- STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。
- STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。
- STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语
法本身导致的。
2.Stirng容器
2.1为什么需要学习String容器?
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,
但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可
能还会越界访问。
为了优化这个问题,我们引入了String容器。
2.2初始String:
string本身是一个类模板:
string就是char类型的数组,char类型一个字节
wstring是wchar类型的数组,wchar为两个字节
char16_t类型为2字节,char32_t为4个字节
- 🔥string是表示字符串的字符串类
- 🔥该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
- 🔥string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>
string; - 🔥不能操作多字节或者变长字符的序列。在使用string类时,必须包含#include头文件以及using namespace std;
2.3String类的常用接口说明(注意下面我只讲解最常用的接口)
2.3.1string类对象的常见构造:
- Strin在C++98下有以下几种构造函数:
第二种: string s3 = "hello world";
这里是一个const char*类型隐式转换成string类型
第三种: string s4(s3, 6, 3);
子字符串构造函数
🔥复制str中从字符位置pos开始并跨越len个字符的部分(如果str太短或len为string::npos,则复制到str的末尾)。
🔥第三个参数有缺省值,npos是无符号整形,-1代表整形最大值为42亿多
string s1; string s2("hello world"); string s3 = "hello world"; string s4(s3, 6, 3); string s5(s3, 6, 13); cout << s5 << endl; string s6(s3, 6); cout << s6 << endl; string s7("hello world", 5); cout << s7 << endl; string s8(10, '*'); cout << s8 << endl;
- 本部分会详细介绍以下几个构造函数:
(constructor)函数名称 | 功能说明 |
string() (重点) | 构造空的string类对象,即空字符串 |
string(const char* s) (重点) | 用C-string来构造string类对象 |
string(size_t n, char c) | string类对象中包含n个字符c |
string(const string&s) (重点) | 拷贝构造函数 |
- string() (重点):
构造空的string类对象,即空字符串
这里的空字符串指的是连\0都没有的
string s1(""); string s2();
- 🔥s1是只有\0,s2是连\0都没有,s1的size和length都为0,capacity为15,s2没有size和length和capacity
- string(const char* s) (重点):
复制以s为指向的以空结尾的字符序列(C-string)。
int main() { const char* p = "aaaaa"; string s1(p); cout <<s1 << endl;//aaaaa return 0; }
- string(size_t n, char c):
用字符c的n个连续副本填充字符串。
string s2(4, 'b'); cout << s2 << endl;//bbbb
- string(const string&s) (重点)
构造一个str的副本。
string s3(s2);