【C++】算法笔记-第六章STL模板

1 STL分类:

1.1 容器:string、vector、deque/stack/queue、list、set、map、priority_queue、pair

  • 序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置。
  • 关联式容器:二叉树结构,各元素之间没有 严格的物理上的顺序关系

1.1.1 string 2020.07.20

char* 和char:[] 区别

  1. 赋值:重载运算符号 = | str.assign();
  2. 拼接:重载运算符号 += | str.append();
  3. 查找:str.find() | str.rfind()
  4. 替换:str.replace()
  5. 比较:s1.compare(s2) s1=s2 return 0;
  6. 存取:str[i] | str.at(i)
  7. 插入:str.insert(i, s1)
  8. 删除:str.erase(i, len)
  9. 子串:str.substr(i, len)

1.1.2 vector 2020.07.22

vector<T> v;

  1. 赋值:v.assign() | v() | v.push_back()
  2. 访问:vector<T>::iterator it = v.begin(); it != v.end(); it++; *it进行访问 | v.at(i) | v[i] | v.front() | v.back()
  3. 容量:v.empty() | v.capacity()

empty和capacity区别

  1. 大小:v.resize(len, element)
  2. 插入:v.insert() | v.push_back()
  3. 删除:v.erase() | v.pop_back() | v.clear()
  4. 互换:v1.swap(v2) | vector<T>(v).swap(v)巧用匿名对象收缩内存
  5. 预留内存(没有初始化):v.reserve()

1.1.3 deque/stack/queue 2020.07.24

deque

  • 双端数组,可以对头端进行插入删除操作
  • deque与vector区别:
    1.vector对于头部的插入删除效率低,数据量越大,效率越低
    2.deque相对而言,对头部的插入删除速度回比vector快
    3.vector访问元素时的速度会比deque快,这和两者内部实现有关

deque<T> d;

  1. 两端插入:d.push_front() | d.push_back()
  2. 两端删除:d.pop_front() | d.pop_back()

stack

stack<T> st;

  1. 插入:st.push();
  2. 读取栈顶:st.top();
  3. 删除栈顶:st.pop();

queue

queue<T> q;

  1. 插入:q.push();
  2. 读取:q.front() | q.back()
  3. 删除:q.pop()

1.1.4 list 2020.07.26

list与vector区别

list<T> lst;

  1. 赋值:lst.assign() | lst1=lst2
  2. 交换:lst.swap()
  3. 访问:list<T>::iterator it = lst.begin(); it != lst.end(); it++; *it进行访问
  4. 容量:lst.empty() | lst.size()
  5. 大小:lst.resize(len, element)
  6. (两端)插入:lst.push_front() | lst.push_back() | lst.insert()
  7. (两端)删除:lst.pop_front() | lst.pop_back() | lst.erase() | lst.remove(element) | lst.clear()
  8. 存取:lst.front() | lst.back()
  9. 反转:lst.reverse()
  10. 排序: lst.sort()

1.1.5 set 2020.07.27

  • 内部自动有序,不含重复元素
  • 只支持迭代器访问

set <T> st;

  1. 访问:set<T>::iterator it = st.begin(); it != st.end(); it++; *it进行访问
  2. insert(x):插入x并自动排序去重
  3. find(val):返回val值对应的迭代器
  4. erase(it):删除单个元素,结合find()使用st.erase(st.find(val));删除区间
  5. 其他:size();clear();

1.1.6 map 2020.07.28

  • map 可以将任何类型和任何类型做映射
  • map以键从小到大自动排序(红黑树实现) 如:(1,1)(1,3)(2,1)
  • map中键和值是唯一的,一个键对应多个值要用multimap
  • 只能用string做字符串映射,不能用char[]

map <T1, T2> mp;

  1. 访问:下标 mp[‘a’] | 迭代器 it->first访问键 ,it->second访问值
  2. find(key):返回键值为key的迭代器
  3. erase():erase(it)删除it的迭代器 | erase(key)删除key值对应的迭代器

1.1.7 priority-queue 2020.07.29

  • 队首元素优先级最高(数字大、字典序大)
  • 头文件:#include<queque>
    priority_queque<T> pq;
    priority_queque<T, vector<int>, less<int> > pq;
  1. 访问:top
  2. 入队:push
  3. 出队:pop
  4. 第二个参数:堆的容器
  5. 第三个参数:对第一个参数的比较方法
  • less<int>数字大,优先级大
  • greater<int>数字小,优先级大

1.1.8 pair2020.07.30

  • 头文件:#include<utility> 或者<map>中也包含
  1. 构建:pair<string, int> p(“haha”, 5) | make_pair(“haha”, 5)
  2. 访问:p->first & p->second
  3. 比较:先比较first,first相等比较second
  4. pair作为map的键值进行插入:mp.insert(make_pair(“haha”, 5)) 用it->first访问键,it->second访问值

1.2 算法

  • 质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
  • 非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等

algorithm

  1. max() | min() | abs() :两个参数
    fabs()头文件:math
  2. swap() 交换x和y的值
  3. reverse(it_begin, it_end):区间内元素反转[ , )
  4. fill(it_begin, it_end, val):区间内元素置数[ , )
  5. sort(it_begin, it_end, cmp):(默认升序)排序、map和set不能用
  6. next_permutation() :下一个全排列中的序列
  7. lower_bound() | upper_bound() :对有序数组或者容器进行

1.3 迭代器(类似指针)

常用的容器中迭代器种类为双向迭代器,和随机访问迭代器

猜你喜欢

转载自blog.csdn.net/helloworld0529/article/details/107457003