1、什么是STL?
STL简介:STL(Standard Template Library)标准模板库,是“容器”的集合。
2、STL核心类库的基本概念
容器(Containers)可容纳各种数据类型的数据结构(计算机存储、组织数据的方式)C++提供了各种不同类型的容器,比如deque、list、vector、map等。
迭代器(iterators)可依次存取容器中元素的东西。比如数组int array[100]就是个容器,而int*类型的指针变量就可以作为迭代器,可以用来遍历容器的所有元素。
算法(Algorithms)算法作用于容器。算法提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象。
STL内的所有组件都由模板(template)构成,其元素可以是任意类型。
STL容器:
常用顺序容器:vector、deque、list
常用关联容器:set、map
容器适配器:stack、queue、priority_queue
STL算法:搜寻、排序、拷贝等
3、Vector
向量(Vector):是一个顺序容器(Sequence Container),它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组(元素个数可变)。
函数名 | 函数说明 |
push_back(元素) | 增加一个元素到向量后面 |
Insert(位置,元素) | 插入元素到向量的指定位置 |
Insert(位置,个数n,元素) | 插入n个相同的元素到指定位置 |
Insert(位置,向量头指针first,尾指针end) | 将另一个向量从first开始到end结束(不包括end)之间的内容插入该向量的指定位置 |
erase(位置) | 删除指定位置的元素 |
pop_back() | 弹出(删除)向量的最后一个元素 |
clear() | 清除向量所有元素,size()变为0 |
运算符[i] | 取向量下标为i的元素 |
front() | 取向量第一个元素 |
back() | 取向量最后一个元素 |
begin() | 返回向量头指针(迭代器),指向第一个元素 |
end() | 返回向量尾指针,指向向量最后一个元素的下一个位置 |
rbegin() | 反向迭代器,指向最后一个元素 |
rend() | 反向迭代器,指向第一个元素之前的位置 |
size() | 返回向量中实际元素的个数 |
resize(大小) | 重新设定向量的大小,也就是可以保存元素的个数 |
max_size() | 得到Vector最大可以是多大 |
empty() | 判断向量是否为空,等价于size()为0 |
swap() | 交换两个同类型向量的数据 |
对应于数组,要注意:向量的大小是可变的,开始时向量为空,随着不断插入元素,向量自动申请空间,容量变大。
注意学会使用:sort()、reverse()等函数对vector进行排序、逆序等操作。
例子:vector的存储和遍历
注意掌握vector构造的4个常见方法:
(1)vector():创建一个空vector
#include <bits/stdc++.h> using namespace std; void print(vector<int> v){ for(int i=0;i<v.size();i++){ //vector:可以使用下标访问,但不能越界 cout<<v[i]<<" "; } } int main(){ //定义vector存储int类型的变量 vector<int> v; //size():获取vector存储元素的个数 cout<<v.size()<<endl; //注意:常见错误,vector<int> v定义一个空的vector,不可以用下标来存储或访问元素 v.push_back(10); v.push_back(20); v.push_back(30); cout<<v.size()<<endl; print(v); return 0; }
(2)vector(n):创建一个元素个数为n的vector
(3)vector(n,t):创建一个元素个数为n且值为t的vector
(4)vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
#include <bits/stdc++.h> using namespace std; void print(vector<int> v){ for(int i=0;i<v.size();i++){ //vector:可以使用下标访问,但不能越界 cout<<v[i]<<" "; } } int main(){ //定义方法1: //vector<int> v; //定义方法2:定义一个长度为5的vector,默认值为0 // vector<int> v(5); //定义方法3:定义长度为5的vector,默认值为80; //vector<int> v(5,80); int a[]={10,20,30,40,50}; //定义方法4:使用数组来初始化vector //sizeof():计算变量占用的字节数 cout<<sizeof(a)/sizeof(int)<<endl; //计算数组中有多少个元素,即数组的实际长度 vector<int> v(a,a+sizeof(a)/sizeof(int)); v.push_back(10); print(v); return 0; }
例子:vector的插入、删除、获取头尾元素
#include <bits/stdc++.h> using namespace std; void print(vector<int> v){ for(int i=0;i<v.size();i++){ //vector:可以使用下标访问,但不能越界 cout<<v[i]<<" "; } } int main(){ vector<int> v; v.push_back(10); v.push_back(20); v.push_back(30); //print(v); //insert(位置,元素):位置必须提供位置指针 //向vector中下标为1的位置插入100; //v.insert(v.begin()+1,100); //向vector中下标为1的位置,插入5个100 // //v.insert(v.begin()+1,5,100) ; // vector<int> v2; // v2.push_back(100); // v2.push_back(200); // v2.push_back(300); // //把v2的三个元素插入到v中下标为1的位置 // v.insert(v.begin()+1,v2.begin(),v2.end()) ; //删除v中下标为1的元素 // v.erase(v.begin()+1); //删除v中下标为1的元素 和之后的所有元素 v.erase(v.begin()+1,v.end()); print(v); return 0; }
例子:size()、resize()、swap()、sort()、reverse()函数
#include <bits/stdc++.h> using namespace std; void print(vector<int> v){ for(int i=0;i<v.size();i++){ cout<<v[i]<<" "; } cout<<endl; } int main(){ vector<int> v1; // v1.push_back(10); // v1.push_back(20); // // vector<int> v2; // v2.push_back(100); // v2.push_back(200); // v2.push_back(300); // // swap(v1,v2); // cout<<"v1"<<" "; // print(v1); // cout<<endl; // cout<<"v2"<<" "; // print(v2); int a[] = {5,3,1,4,2}; vector<int> v(a,a+5); sort(v.begin(),v.end()); print(v); reverse(v.begin(),v.end()); print(v); //重置vector的大小为20 v.resize(20); print(v); return 0; }
例子:二维vector
这里最外的<>要有空格,否则在比较旧的编译器下无法通过。
#include <bits/stdc++.h> using namespace std; int main(){ //定义二维vector //外层>加一个空格,因为>>表示右移运算符 vector<vector<int> > v(20); for(int i=0; i<5;i++){ for(int j=0;j<5;j++){ v[i].push_back(i+j); } } for(int i=0;i<5;i++){ for(int j=0;j<5;j++){ cout<<v[i][j]<<" "; } cout<<endl; } return 0; }