云起工作室 15711107967
02-51cto-STL六大组件
2023-01-11 18:40:40

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