1、介绍
c++ 标准模板库(以下简称STL)是一套功能强大的 c++ 模板类
为我们提供了通用的模版类与基本函数
对于初学者来说,已经可以用其实现多种常用的算法与数据结构
比如:向量、链表、队列、栈等等
STL的主要包括六部分
容器(Containers) | 用于存放数据,可以存放变量或者对象 |
算法(Algorithms) | |
迭代器(Iterators) | |
仿函数(Functors) | |
适配器(Adaptors) | |
分配器(Allocators) |
2、容器(Containers)
容器主要有三种类型,顺序性容器、关联性容器与容器适配器
2.1、顺序性容器
主要有:vector(动态数组)、list(双向链表)、deque
2.1.1、vector(动态数组)
又称可变长数组、向量,开在堆空间里,避免了在局部区域中数组过大而导致爆栈的问题
所以局部区域中不可以开大长度数组,但可以开 vector
优缺点:方便查找元素,但插入操作麻烦
2.1.1.1、头文件
#include<vector>//万能头包含
2.1.1.2、初始化
模板:
vector < 数据类型 > 名称 ( 长度 , 初值 );
列如:
vector<int> a;//定义数组a,存储int类型数据
vector<double> b;//定义数组b,存储double类型数据
vector<node> c;//定义数组c,存储结构体node
vector<int> d(10);//限制下标为 0~10-1
vector<int> e(10,5);//限制下标为 0~10-1,并将所有元素初始值设为5
vector<int> f(a);//将数组a拷贝到f
vector<int>::iterator it;//定义迭代器
2.1.1.3、函数
向量大小: a.size( );
更改大小为a: a.resize( a );
向量判空: a.empty( );
末尾添加a: a.push_back( a );
末尾删除元素: a.pop_back( );
a位置插入b: a.insert( a,b );
a位置插入n个b:a.insert( a,n,b );
a位置删除元素: a.erase( a );
交换 a,b 元素: a.swap( a,b );
清空元素: a.clear( );
开始指针:a.begin( );
末尾指针:a.end( );
标访问a位置: a[ a ];
返回第一个元素:a.front( );
返回最后一个元素:a.back( );
#include<bits/stdc++.h>
using namespace std;
vector<int> a(10,1);
vector<int> b(10,4);
void print(){
vector<int>::iterator it;
for(it=a.begin();it!=a.end();it++)
cout<<*it<<' ';
cout<<endl;
}
int main()
{
cout<<a.size()<<endl;
a.pop_back();
print();
a.resize(15);
cout<<a.size()<<endl;
print();
a.push_back(2);
a.insert(a.begin()+3,3);
print();
a.erase(a.begin()+2);
print();
a.swap(b);
print();
cout<<a.front()<<' '<<a.back()<<endl;
cout<<a.empty()<<' ';
a.clear();
cout<<a.empty();
return 0;
}
2.1.1.4、算法
遍历元素:
vector<int>::iterator it;
for(it=a.begin();it!=a.end();it++)
cout<<*it;
元素翻转:
reverse(a.begin(),a.end());
2.1.2、list(双向链表)
元素在内存中的位置不一定连续,要访问一个元素要依靠它的前驱或者后继
同时它是一个循环链表,可以节省不必要的空间
只能通过迭代器访问,关于迭代器,不能有 +=n 或 -=n 的操作(仅限 list )
优缺点:存储不连续,方便元素插入与删除操作,但不能进行随机访问,占用内存多
2.1.2.1、头文件
#include<list>//万能头包含
2.1.2.2、初始化
模版:list < 数据类型 > 名称 ( 长度 , 初值 );
list<int> a;//定义链表a,类型为int
list<double> b;//定义链表b,类型为int
list<node> c;//定义链表c,类型为结构体note(要提前声明)
list<int> d(10);//定义长度为10的链表d
list<int> e(10,5);//定义长度为10的链表e,初值为5
list<int> f(a);//拷贝a到f
list<int>::iterator it;//定义迭代器
2.1.2.3、函数
开头插入a:a.push_front( a );
开头删除元素:a.pop_front( );
删除与a值相等的元素:a.remove( a );
返回第一个元素:a.front( );
返回最后一个元素:a.back( );
大小: a.size( );
更改大小为a: a.resize( a );
链表判空: a.empty( );
末尾添加a: a.push_back( a );
末尾删除元素: a.pop_back( );
a位置插入b: a.insert( a,b );
a位置插入n个b:a.insert( a,n,b );
a位置删除元素: a.erase( a );
交换 a,b 元素: a.swap( a,b );
清空元素: a.clear( );
开始指针:a.begin( );
末尾指针:a.end( );
#include<bits/stdc++.h>
using namespace std;
list<int> a(10,1);
list<int> b(10,4);
void print(){
list<int>::iterator it;
for(it=a.begin();it!=a.end();it++)
cout<<*it<<' ';
cout<<endl;
}
int main()
{
cout<<a.size()<<endl;
a.pop_back();
print();
a.resize(15);
cout<<a.size()<<endl;
print();
a.push_back(2);
a.insert(a.begin(),2,3);//不能用+n
print();
a.erase(a.begin());//不能用-n
print();
a.swap(b);
print();
a.push_front(5);
a.push_front(6);
print();
a.pop_front();
print();
a.remove(4);
print();
a.resize(2);
cout<<a.front()<<' '<<a.back()<<endl;
cout<<a.empty()<<' ';
a.clear();
cout<<a.empty();
return 0;
}
2.1.2.4、算法
元素遍历
list<int>::iterator it;
for(it=a.begin;it!=a.end;it++)
cout<<*it;