参考:
https://www.cnblogs.com/al-fajr/p/11285579.html
https://baike.baidu.com/item/%E6%A0%87%E5%87%86%E6%A8%A1%E6%9D%BF%E5%BA%93/5513832?fromtitle=STL&fromid=70103&fr=aladdin
1.STL
- STL(StandardTemplate Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++Standard Library)中,是ANSI/ISOC++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。
- 逻辑层次来看,在STL中体现了泛型化程序设计的思想(genericprogramming),与OOP(object-orientedprogramming)中的多态(polymorphism)一样,泛型也是一种软件的复用技术;
2.六大组件
- 容器(Container)
是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器; - 算法(Algorithm)
是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用; - 迭代器(Iterator)
提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象; - 仿函数(Function object),
仿函数(functor)又称之为函数对象(functionobject),其实就是重载了()操作符的struct,没有什么特别的地方 - 适配器(Adaptor)
- 分配器(allocator)
其中主要工作包括两部分1.对象的创建与销毁 2.内存的获取与释放
3.容器(leetcode必备)
容器包含关联容器和顺序容器两大类。关联容器和顺序容器的根本不同在于:关联容器中的元素是按关键字来保存和访问的,而顺序容器中的元素则是按它们在容器中的位置来顺序保存和访问的。
顺序容器
- vector
将元素置于一个动态数组中加以管理,可以随机存取元素(用索引直接存取),数组尾部添加或移除元素非常快速。但是在中部或头部安插元素比较费时;
#include <iostream>
#include <vector>
#define varName(x) #x
using namespace std;
void cout_vector(vector<int> &a, string name){
// size() 获取长度
for(int i=0; i<a.size(); i++){
if(i == 0){
cout<<"vector " << name<<": ";
}
cout<< a[i] << ' ';
if(i == a.size() - 1){
cout<<endl;
}
}
}
int main(){
// 定义向量a
vector<int> a;
// 指定长度
vector<int> b[10];
// 指定长度和初始值
vector<int> c(10, -1);
for(int i=0; i<10; i++){
// 在数组最后追加元素,类似python中的append
a.push_back(i);
}
cout_vector(a, "a");
vector<int> d = a;
// 删除最后一个元素
a.pop_back();
cout_vector(a, "a");
// 判断是否为空
cout<<"b是否为空:"<<b->empty()<<endl;
b->push_back(7);
cout<<"b是否为空:"<<b->empty()<<endl;
// max_size 返回最大可允许的数量
cout<<"vector允许的最大数量: " <<a.max_size()<<endl;
// capacity 返回当前向量能容纳的最大元素值
cout<<"a允许的最大元素值" <<a.capacity()<<endl;
// at 返回pos位置的引用
cout<< "a索引为5的位置的值: "<<a.at(5)<<endl;
// begin 返回指向首位元素的迭代器
// end 返回指向末尾元素下一个位置的迭代器
// rbegin 反向迭代器,指向最后一个元素
// rend 反向迭代器,指向第一个元素前的位置
vector<int>::iterator it;
for(it=a.begin(); it!=a.end();it++){
cout<<*it<< " ";
}
cout<<endl;
// swap交换两个vector的元素
a.swap(c);
cout_vector(a, "a");
cout_vector(c, "c");
// void assign(int n,const T& x):设置向量中前n个元素的值为x
// void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素
a.assign(6, 6);
cout_vector(a, "a");
c.assign(9, 11);
cout_vector(c, "c");
// clear清空所有元素
c.clear();
cout<<"c是否为空:"<<c.empty()<<endl;
// erase删除指向指针的数据项
cout_vector(d, "d");
d.erase(d.begin() + 1);
cout_vector(d, "d");
// 二维vector
// 1、利用push_back函数
vector<vector<int>> vec;
vector<int> x;
vector<int> y;
x.push_back(1);
x.push_back(2);
x.push_back(3);
y.push_back(4);
y.push_back(5);
y.push_back(6);
vec.push_back(x);
vec.push_back(y);
// 2、定义好后直接赋值,用的vscode,调试有点问题
// int N=5, M=6;
// vector<vector<int>> obj(N, vector<int>(M)); //定义二维动态数组5行6列
// for(int i=0; i< obj.size(); i++)//输出二维动态数组
// {
// for(int j=0;j<obj[i].size();j++)
// {
// cout<<obj[i][j]<<" ";
// }
// cout<<"\n";
// }
return 0;
}
- deque
是“double-ended queue”的缩写,可以随机存取元素(用索引直接存取),数组头部和尾部添加或移除元素都非常快速。但是在中部或头部安插元素比较费时;
图片引用自:https://blog.youkuaiyun.com/weixin_42462202/article/details/87537503
- list
双向链表,不提供随机存取(按顺序走到需存取的元素,O(n)),在任何位置上执行插入或删除动作都非常迅速,内部只需调整一下指针;
关联容器
适配器
- stack
底层是vector
size() 返回栈的长度
empty() 判断是否空的
push() 往栈顶插入一个元素
top() 返回栈顶元素
pop() 弹出栈顶元素
- queue
底层是deque
size()
empty()
push() 向队尾插入一个元素
front() 返回队头元素
back() 返回队尾元素
pop() 弹出队头元素
- priority_queue
底层是vector
empty()
push() 插入一个元素
top() 返回堆顶元素
pop() 弹出堆顶元素