本周学习的基础知识:
STL可以分为算法类与容器类;
1.算法类:
-快速排序 sort(a,a=10)
-数据交换 swap(a,b)
-下一个排列 next_permutation(a,a+n)
如3位数的全排列有123、132、213、231、312、321
设a的排列为123,使用函数next_permutation(a,a+1)后返回132
注意,若a为最后一个排列,如321,使用一次函数无作用,再次使用函数得123
-最值 template<class_Tp>
2.容器类:
-字符串string
-不限长度的数组vector
-队列queue、堆栈stack、双端队列deque
-优先队列priority_queue
-简单红黑树set
-通过键值建立的平衡二叉树map
-允许多个相同值的上述两种结构multiset和multimap
-位集bitset
————————————————————————
vector向量是一个看上去很像链表的顺序容器,是一个不限制数组长度的数组【但因为申请内存的原理,处理大量数据时比数组慢】
-基础数据访问:operator[]、top()、back()
-简单的数据操作:erase(int index, int size)、insert(int index, int size)、push_back(int value)、pop_back()
-自身属性操作:size()、重新整理内存单元resize(int size)
-整体操作:清空向量clear()、判断是否为空empty()
————————————————————————
iterator迭代器时用于访问容器内数组的指针,使用更加稳定
-返回容器第一个元素a.begin()
-返回容器末尾元素a.end()
迭代器使用遵循左闭右开原则,begin访问第一个元素,end访问第一个无效元素(最后一个有效元素的下一位)
vector<int>a;//定义向量容器
vector<int>::iterator it;//定义向量的迭代器
for(it=a.begin(); it!=a.end(); it++)//使用迭代器遍历容器
————————————————————————
stack栈是仅在表头进行插入和删除操作的线性表;需使用头文件<stack>;可能会出现爆栈问题!
常用函数:向栈顶压入元素push()、弹出栈顶元素pop()、访问栈顶元素top()
queue是仅在表头front插入,在表末rear插入的特殊线性表;需使用头文件<queue>
常用函数:访问队首元素front()、访问队尾元素back()、向队尾插入元素push()、弹出队首元素pop()
————————————————————————
priority_queue优先队列顾名思义,就是优先级最高的元素先出队,每次push和pop操作后队列都会动态调整
相关函数:top()、pop()、插入新元素push(item)
在STL中,优先队列是用二叉堆实现的,在队列中push或pop一个元素,复杂度是O(log2n)
或者push所有数后把数据一个个top出来用来排序,总复杂度是O(nlog2n)
————————————————————————
set集合由二叉搜索树实现,容器内数据唯一且排好序的,访问元素的复杂度为O(log2n),非常高效
————————————————————————
map是关联容器,使用平衡二叉搜索树储存和访问,实现从键(key)到值(value)的映射
操作方法:
定义——map<string, int>student,存储学生的name和id;
赋值——如student["Tom"]=15这里把"Tom"当成普通数组下标来使用;
查找——查找学号时,可以直接用student["Tom"]表示他的id,不用再去搜索所有姓名;
————————————————————————
最后是两个sort相关的函数:
stable_sort():稳定的排序,当排序元素相同时,保持原来的顺序。
partial_sort():局部排序,如10个数求最小的5个,使用sort()排序需要先全部排序再输出5个,而p可以直接输出前5个
————————————————————————
本周还学习了贪心算法的基本知识,鉴于我还没有完全掌握,就放在下一周的总结中。
希望下周能解决一些常见的贪心算法的问题:
1.活动安排问题
2.区间覆盖问题
3.最优装载问题
4.多机调度问题
5.Huffman编码
6.模拟退火
完成习题:
Hdu1789、1050、2546、3348、4864、1328、1089