容器概述:可以用来存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是类模板,分为三种:
1.顺序容器:vector,deque,list
2.关联容器: set,multiset,map,multimap
3.容器适配器:stack,queue,priority_queue
vector 头文件:动态数组元素在内存连续存放。随机存取任何元素都能在常数时间完成。在尾端增删元素具有较佳的性能(大部分情况下是常数时间)。
deque 头文件双向队列。元素在内存连续存放。随机存取任何元素都能在常数时间完成(但次于vector)。在两端增删元素具有较佳的性能(大部分情况下是常数时间)。
list 头文件:双向链表。元素在内存不连续存放。在任何位置增删元素都能在常数时间完成,不支持随机存取。
关联容器简介
元素是排序的
插入任何元素,都按相应的排序规则来确定其位置
在查找时具有非常好的性能
通常以平衡二叉树方式实现,插入和检索的时间都是O(log(n))
set/multiset 头文件
set 即集合。set中不允许相同元素,multiset中允许存在相同元素
map/multimap 头文件
map与set的不同在于map中存放的元素有且仅有两个成员变量,一个名为first,一个名为second,map根据first值对元素进行从大到小排序,并且可快速地根据first来检索元素。
stack :头文件
queue: 头文件
priority_queue 头文件
顺序容器和关联容器中都有的成员函数
begin 返回指向容器中第一个元素的迭代器
end 返回指向容器中最后一个元素后面的位置的迭代器
rbegin 返回指向容器中最后一个元素的迭代器
rend 返回指向容器中第一个元素前面的位置的迭代器
erase 从容器中删除一个或者几个元素
clear 从容器中删除所以元素
顺序容器的常用成员函数
front:返回容器中第一个元素的引用
back:返回容器中最后一个元素的引用
push_back:在容器末尾增加新元素
pop_back:删除容器末尾的元素
erase:删除迭代器指向的元素(可能会使该迭代器失效),或者删除一个区间,返回被删除元素后面的那个元素的迭代器
迭代器
函数对象
若一个类重载了运算符“()”,则该类的对象就成为函数对象
class CMyAverage{//函数对象类
public:
double operator()(int a1,int a2,int a3){
return (double)(a1+a2+a3)/3;
}
};
CMyAverage average;//函数对象
cout<<average(3,2,3);//average.operator()(3,2,3)
输出2.66667
vectorname; 和一维数组一样,typename也可以是任何数据库类型,但是如果typename也是一个STL容器,定义的时候要记得在>>符号之间加上空格。
vector name;
vector name;
vector name;
vector name;
如果typename是vector: vector
vector容器内的元素访问
通过下标访问
vectorvi的容器,vi[0],vi[1]
通过迭代器访问
vector::iterator it;
迭代器it
例如
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);//在vi的末尾添加元素i,即依次添加1,2,3,4,5
}
#include
#include
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
//vi.begin()为取vi得元素首地址,而it指向这个地址
vector<int>::iterator it=begin();
for(int i=0;i<5;i++){
printf("%d",*(it+i));//输出v[i]
}
return 0;
}
输出结果:1 2 3 4 5
迭代器还实现了两种自加操作:it++,++it
#include
#include
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
//vector得迭代器不支持it
for(vector<int>::iterator it=begin();it!=vi.end();it++){
printf("&d",*it);
}
return 0;
}
输出结果:1 2 3 4 5
最后指出在常用得STL容器中,只有在vector和string中才允许使用ci.begin()+3 这种迭代器加上整数的写法。
vector常用函数实例
vi.push_back() push_back(x)就是在vector后面添加一个元素x;
vi.pop_back() 用来删除vector的尾元素;
vi.size()用来获取vector中的元素个数;
vi.clear() 用来清空vector中的所有元素;
insert(it,x)用来向vector的任意迭代器it处插入一个元素x;vi.insert(vi.begin()+2,-1)
将-1插入到vi[2]的位置
erase()有两种用法:删除单个元素和删除一个区间内的所有元素vi.erase[vi.begin()+3]
;vi.erase[vi.begin()+1,vi.begin()+4]
;