STL:
标准模板库。各种函数的模板和类的模板
几个概念:
容器:可容纳各种数据类型的通用数据结构,是类模板。
迭代器:可用于依次存取容器中的元素,类似于指针,用iterator来进行对一个容器中单个元素的访问。
算法:用来操作容器中的元素的函数模板。
容器分类:都必须调用同名的头文件
(1)顺序容器:
vector,向量容器,deque双向队列,list双向链表
(2)关联容器:
set集合,multiset(允许出现重复的集合),map映射,multimap多重映射(可以两个自变量函数值相同)
(3)容器适配器
stack栈,queue队列,priority_queue优先队列
顺序容器:元素插入和元素本身无关,即不会进行自动排序。
关联容器:元素是排序的,在查找时有很好的性能,一般都用平衡二叉树实现,map的元素对象有且只有两个成员变量一个叫first一个叫second,根据first来排序。
容器适配器:
栈filo,队列fifo,分别需要使用头文件<stack> 和<queue>
顺序容器中的方法:
front返回容器中第一个元素的引用
back返回容器最后一个元素的引用
push_back在容器末尾增加一个元素
pop_back删除容器末尾的一个元素
erase 删除迭代器指向的元素(可能使得迭代器失效,)也可以删除容器中一段长度的区间,返回被删除元素后面的那个迭代器。
顺序容器和关联容器中都有的方法:
begin 返回指向容器中第一个元素的迭代器(而不是下标!!)
end 返回指向容器中最后一个元素后面的位置的迭代器
rbegin 返回指向容器中最后一个元素的迭代器(和end差一位哦)
rend 返回指向容器第一个元素前面的位置的迭代器
erase, 从容器中删除一个或者几个元素
clear 从容器中删除所有元素
iterator:
有const和非const两种,const不可以修改指向的内容
双向迭代器(==,!=,++,--)
随机访问迭代器(+,+=,-,-=,<,>,<=,>=,和双向迭代器所有的操作符)
vector实现二维数组:
用vector套vector的方法,vector<vector<int> > m(3);
vector有的方法deque都有,不过还有push_front,pop_front.
若一个类重载了(),则该类的对象就是函数对象。
在进行将一个容器的一部分复制到另一个容器或者自己的另一个部分时,一般选用从末尾开始向前复制,比如要移动一个容器中的一部分(为了避免出现覆盖),有的可能想要先复制这一部分到另一个temp数组然后再贴回原容器,但是不如直接从后向前倒退着复制(即要贴的部分相对于原容器有效的内容要靠后一些,如果靠前则相反,)这样减少了计算的时间复杂度和空间复杂度.
functional和algorithm头文件中有greater和less,是函数模板,greater判断是不是左大于右,less相反。模板函数实例化的时候必须传入参数,比如greater<double>()//()千万不能忘记这是一个函数而不是函数对象!!!!!!!!经常在容器内部排序中使用。
algorithm中的unique函数是一个去重函数,去除相邻的重复元素,而且删除没有把重复元素删除,只不过全部放在数组的后面,所以要注意使用unique函数之前需要先对数组进行排序!!!!!!!
unique也并不会改变容器本身的大小,它的返回值是一个指向最后一个被“删除”的元素的迭代器,也就是返回的迭代器到容器最后的end()都是重复的元素,如果真的要删除就需要再删除(erase函数)。
list中的unique也是需要先排序再删除,同时注意list中unique会销毁重复的元素。
关联容器:
内部已经排好序的容器,在插入的时候就进行排序,同时注意这里判断相等是使用互相满足不小于的。
注:pair模板在utility头文件中定义的。
同样,我们可以使用make_pair函数创造一个pair,而且不需要传入类型参数,会依据传入的数据类型生成pair。
map的迭代器也是指向map中的元素(是一个pair类型)也就是说需要it->first,这样的形式来调用key和value
map中同样有lower_bound 和 upper_bound,以及equal_range 不过是针对key的