思维导图(建议收藏,复习小宝贝)
一、STL简介
1.什么是SLT
STL(standard template libaray-标准模板库)
是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。从根本上说,STL是一些"容器"的集合,这些"容器"有list、vector、set、map等,STL也是算法和其他一些组件的集合。
2.STL的六大组件
网上有句话说:“不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。
二、string类简介
对于string,在C语言中我们是比较熟悉的;当我们对字符串进行处理时(如:strlen、strcpy、strcat等),但是这些库函数与字符串是分离开的,不太符合OOP(Object Oriented Programming,OOP,面向对象程序设计)的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
在C++中,string是用来管理字符数组的一个类,是STL中的一个容器。string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,对于字符串的处理交由string而不是编程人员,大大提升了效率,所有学好STL是很有必要的。
在使用string类时,必须包含#include<string>头文件以及using namespace std;
三、string类的常用
在string类中包含100多种接口函数,但是在日常做题或日后的使用中,经常使用的比较少,我们必须要将这些常见的函数重点掌握,其他大概了解一下,如果有不懂的可以查看C++文档。
1. string类对象初始化操作
1.构造函数
如下图所示,C++中string类提供了7种构造函数,我们在学习string类时,只需要将默认构造、拷贝构造和含参构造重点掌握及使用,其余了解即可;
#include <iostream> #include <string> using namespace std; int main() { string s1;//默认构造 string s2("hello world");//含参构造 string s3(s2);//拷贝构造 cin >> s1; cout << s1 << endl; cout << s2 << endl; cout << s3 << endl; string s4(s2, 2, 6);//从时s2字符串的第二个位置开始拷贝,拷贝6个; cout << s4 << endl; string s5(s2, 2); string s6(s2, 2, 100);//有多少给多少 return 0; }
这段代码中有两个地方需要了解一下:
string s4(s2, 2, 6);//从时s2字符串的第二个位置开始拷贝,拷贝6个; string s5(s2, 2); string s6(s2, 2, 100);
string(const string& str, size_t pos, size_t len = npos );
这是表格中第三个函数,从某个已经存在的字符串的第pos个位置向后进行拷贝,由于此函数的第三个形参(len)使用的是缺省参数,默认值是-1,又因为是size_t类型的,他就是整型的最大值,C++处理方式:当len有实参传递时,无论实参多大,向后拷贝的个数仅取决于字符串从pos位置向后的个数(有多少拷贝多少);当len没有实参传递时,默认是-1(整型的最大值)也是有多少拷贝多少;
Npos是一个静态成员常数值,它是size_t类型元素的最大可能值。
2.析构函数
系统会自动调用析构函数
3. 赋值重载函数
string str1, str2, str3; str1 = "hello"; // c-string str2 = 'x'; // 用一个字符赋值 str3 = str1; // 用一个对象进行
2.string类对象的容量操作
1.字符串的检查
int main() { string s1; cin >> s1; cout << s1 << endl; //不包含最后作为结尾标识符的\0,计算的是有效字符长度 cout << s1.size() << endl; //求s1的字符个数 cout << s1.length() << endl; //求s1的字符长度 cout << s1.max_size() << endl; //求s1的最大能存储多少字符 cout << s1.capacity() << endl; //求s1的当前的容量 cout << s1.empty() << endl; //判空? s1.clear(); //把有效数据给清掉,但是容量并没有清掉 cout << s1 << "空的字符串" << endl;//检验 return 0; }
2.增容的机制
void TestPushBank() { string s; size_t sz = s.capacity(); cout << "capacity changed:" << sz << '\n'; cout << "making s grow:\n"; for (int i = 0; i < 1000; ++i) { //s.push_back('c'); s += 'c';//尾插字符 if (sz != s.capacity()) { //增容 sz = s.capacity(); cout << "capacity changed:" << sz << '\n'; } } }
从上图中可以看出最初的容量是16(虽然图中显示的是15,它计算的是有效空间,其实忽略了'\0'),从第二次增容开始,32->48->71....,以1.5倍增容的;这是在VS的编译器下,如果是在Linux下,它是以2倍的形式增长的;