3、STL 六大组件 container 容器
3.1、序列容器:
array vector、deque、list、forward_list、stack、queue、priority_queue
3.2、关联容器
set、map、multiset、multimap、unordered_set、unordered_map、unordered_multiset、unordered_multimap
type_id(vetor<int>::iterator::iterator_category).name() 获取迭代器类型
4 动态数组:
4.1 vector<int> v;
v.capacity(); 容量大小
v.size() 元素数量
v.push_back(1); 在末尾添加1
v.insert(v.begin(),3);在前面插入 元素3
v.insert(v.end(),2,5) ; 在末尾插入两个5
v.pop_back();删除最后一个元素
v.erase(v.end()-1);删除最后一个元素
v.srase(v.begin()) ; 删除第一个元素
v.clear(); 清除所有元素,但不会清除容量
v.front() 第一个元素
v.back() 最后一个元素
v.at(key) 索引为key的元素
4.2 deque<int> d; 双向迭代器
d.push_front(1) 在头部插入 元素1 vector 没有此方法
d.pop_front() 从头部删除元素, vector 没有此方法
其他方法同vector
4.3 list<int> l; 双向迭代器;不支持索引访问元素 迭代器不支持 +n -n
l.front() 返回第一个元素
.lback() 返回最后一个元素
其他方法同deque
4.4 #include<forward_list>
forward_list 单向迭代器 没有rbegin() 和rend();支持++ 不支持--
支持push_front() 不支持push_back()
支持insert_after()
4.5 栈
stack<int> s; 先进后出 不支持 索引访问元素;没有迭代器
s.push()
s.pop() 删除栈顶元素
s.top() 栈顶元素
s.empty()
4.6 队列 #include<queue>
queue<int> q; 先进先出,没有迭代器 双端队列
q.front() 队列头元素
q.back() 队列未元素
q.pop()
4.7 #include<queue>
priority_queue<int> pq 优先队列 没有迭代器
不支持front() back()
pq.top() 默认先出值最大的
pq.push(1)
pq.push(3)
pq.push(2)
默认顺序是 3,2,1
修改默认顺序 less
priority_queue<int vector<int>,greater<int>> pq
4.8 set 集合
set<int> s; 不支持索引访问元素 默认升序排列 元素不允许重复,元素不可更改
set<int greater<int>> s;降序排列
s.insert(1) 插入元素
s.insert(1) 第二次插入会失败 s.insert(1).sencond 返回1说明插入成功,0说明插入失败
s.insert(v.begin(),v.end()) 插入其他容器
s.erase(1) 删除值为1的元素
s.erese(s.begin())
s.erese(s.begin(),s.end())
s.clear() 清空
set<int>::iterator it = s.find(9) 查找返回迭代器
if(it!=s.end()){找到}
4.9 map 关联容器
map<int,string> m;
值是 pair类型
4.9.1 pair数据
pair<int, char> p(1,"a"); 或make_pair(2,"b) make_pair 会自动推导数据类型
p.first 是1 即索引, p.second 是值 即 a
m.insert(pair<int,string>(2,"bb")) 插入 已存在key 无法插入
m.insert(make_pair(3,"cc")) 插入 已存在key 无法插入
m[5] = "dd" 插入 已经存在的修改
m.erase(3) 删除key为3的元素
m.erase(m.begin())
for(map<int,string>::iterator it=m.begin();it!=m.end();it++){
cout<<"索引:"<< it->first << "值:"<<it->second<<endl;
}
map<int,string>::iterator it=m.find(3)
if(it!=m.end()){
找到索引为3的元素 it->first it->secnod.c_str() 转换成string
}
cout<< m[33]..c_str() << endl; 如果没有索引为33 会插入,索引判断是否存在要用find
4.10 multiset 集合,与set的区别是允许元素重复
#include<set>
m.find(1) 只能找到 第一个,返回迭代器
pair<multiset<int>::iterator,multiset<int>::iterator> pa=s.equal_range(1) 找到所有值为1 的元素,返回值为1 的第一个到走后一个的迭代器
for(multiset<int>::iterator it=pa.first;it!=pa.second;it++){
cout<< *it <<endl;
}
或
auto pa=s.equal_range(1)
for(auto it=pa.first;it!=pa.second;it++){
cout<< *it <<endl;
}
4.11 multimap 允许key重复的map
multimap<int,string> mm;
不可以使用mm[key] 因为key是可以重复的
auto pa = mm.equal_range(1)
for(auto it==pa.first;it!=pa.second;it++){
cout<< it->first<<it->second.c_str() <<endl;
}
4.12、 unordered_set 元素值唯一、无序的set 没有反向遍历reverse_iterator
4.13、unordered_map 元素索引唯一,无序的map
4.14 、unordered_nultiset 元素值不唯一, 无序的set
4.15、unordered_multimap 元素索引不唯一,无序的map