STL容器总结
1分类
1.1.顺序容器(序列容器)Sequence Container
1.1.1vector
vector概念
1:vector是表示可以改变大小的数组的序列容器。2倍增加
2:向量容器 : 从后面快速插入与删除,可以直接访问任何元素。
vector<int> v;
int n;
while(cin>>n){
//从**后面**快速插入与删除
v.push_back(n);
}
v[4]=40;//直接访问任何元素
1.1.2list
- 列表是序列容器,允许在序列中的任意位置执行恒定时间的插入和删除操作,并允许在两个方向进行迭代。
- 列表容器被实现为**双链接列表;**双链接列表可以将它们包含的每个元素存储在不同和不相关的存储位置。排序在内部由链接到它前面的元素和链接到它后面的元素的每个元素的关联来保持。
- 它们与forward_list非常相似:主要区别在于forward_list对象是单链表,因此只能向前迭代,以换取更小、更高效。
- 与这些其他序列容器相比,list和forward_list的主要缺点是它们不能按位置直接访问元素;
list<int> v;
int n;
while(cin>>n){
v.push_back(n);//尾部添加元素
}
//list不可以随机访问元素
//v[4]=40;//修改元素
1.1.3deque
双端链表容器: 从前面或者后面快速插入与删除,可以直接访问任何元素。
1.2关联容器Associative Container
容器 | 模板 | 特点 |
---|---|---|
映射容器 | map | 一对多映射,基于关键字快速查找,不允许重复值 |
多重映射容器 | multimap | 一对多映射,基于关键字快速查找,允许重复值 |
集合容器 | set | 快速查找,不允许重复值 |
多重集合容器 | multiset | 快速查找,允许重复值 |
1.3容器适配器Container Adapter
容器 | 模板 | 特点 |
---|---|---|
栈容器 | stack | 后进先出(LIFO) |
队列容器 | queue | 先进后出(FIFO) |
优先级队列容器 | priority_queue | 最高优先级元素先出 |
2通用操作
2.1实例化
vector<int> v;
vector<int> v1=(10);//10个大小
int arr[5]={1,2,3,4,5};
vector<int>v2(arr,arr+5);
vector<int>v3(v2);
vector<int>v4(10,100)//10个100
2.2迭代器
**注意:**容器的反向迭代器必须用相应的反向迭代器去接受reveres_iterator
//迭代器遍历 迭代器的使用方法类似于指针访问数组
vector<int>::iterator it=v.begin();
while(it!=v.end()){
cout<<*it<<" ";
++it;
}
2.3重载运算符
2.4大小
2.5插入
vector<int>v4(10,100)//10个100
v4.insert(v.begin()+3,90);//在下标为3的位置插入90 如果插入超出范围吐核
2.6删除
vector<int>v4(10,100)//10个100
v4.insert(v.begin()+3,90);//在下标为3的位置插入90 如果插入超出范围吐核
v4.erase(v.begin()+3);
3. 容器特有操作
3.1 顺序容器特有函数
3.2 关联容器特有查找函数
3.3 容器适配器特有函数
3.4 list特有函数
截取splice
删除remove
去重unique
合并merge
排序reverse
反转sort
#include<iostream>
#include<list>
using namespace std;
int main(){
list<int> v;
int n;
while(cin>>n){
v.push_back(n);//尾部添加元素
}
//list不可以随机访问元素
//v[4]=40;//修改元素
//遍历
//不成立 只有匹配迭代器才可以访问元素
/*
for(int i=0;i<v.size();i++){
cout<<v[i]<<" ";
}*/
cout<<endl;
//删除尾部元素
v.pop_back();
/*
for(int i=0;i<v.size();i++){
cout<<v[i]<<" ";
}
cout<<endl;*/
//迭代器遍历 迭代器的使用方法类似于指针访问数组
list<int>::iterator it=v.begin();
while(it!=v.end()){
cout<<*it<<" ";
++it;
}
cout<<endl;
list<int>::iterator it1;
for(it1=v.begin();it1!=v.end();++it1){
cout<<*it1<<" ";
}
cout<<endl;
int arr[]={1,2,3,4,5,6,7,8};
list<int> l(arr,arr+8);//把数组首地址和最后一个元素的下一个地址
//好处 集合[i,j) 好处是可以表示空集[i,i)
list<int>::iterator it2=v.begin();
while(it2!=v.end()){
cout<<*it2<<" ";
}
cout<<endl;
list<int> w(10,100);
cout<<w.size()<<endl;
auto it=v.begin();
advance(it,3);
v.insert(it,99);
}
4此篇文章主要是参考老师课间完成。
作者:jdzhangxin
链接:https://www.jianshu.com/p/f45c5cf6dd55
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
s