目录:
1.vector,string
2迭代器
3.关联容器
4.容器
自己补充的关于stl的一点内容
5.stl中的排序
6.删除stl容器元素的方法
1.vector,string
vector和string优先于使用数组
原因:vector和string是功能齐全的stl容器,支持的功能也比较齐全。
使用reserve来避免不必要的重新分配
原因:容器一般含有多余的空间,即size<=capicity的。有时候,当size==capicity的时候,当插入一个元素也会导致容器的扩容,当发生扩容时,对于该容器上所有指针和迭代器都会失效,为了保证当前操作的有效性和高效性,可以使用reserve动作来提前保证空间足够来支持插入动作。
注意string的实现的多样性
原因:几乎每个string的实现都会包涵如下信息:
1.字符串的大小,即包涵的字符的个数
2.用于存储该字符串中的字符的内存容量
3.字符串的值
此外,它还可能包涵它的分配子的一份拷贝,另外,建立在计数基础上的string实现可能还包括对值的引用计数。
实现A:
实现B:
实现C:
实现D:
使用swap技巧出去多余的容量
原因:当容器开始容量很大,有很多元素,但是后来元素被删除,导致size<
避免使用vector
原因:vector中存储的是bit位,而不是对象(优化了空间使用),但是导致使用时,取出来的东西不好用,最好使用bitset来存储,专门来存放bit的。
2迭代器
熟悉迭代器之间的相互转化,const_iterator,iterator,reverse_iterator,const_reverse_iterator
确保目标区间足够大
如果需要使用remove这类的算法,请在之后调用erase
了解那些算法需要使用排序的区间作为参数
确保判别式是一个“纯函数”
纯函数-它的结果只和输入有关,而与调用顺序、次数无关(即不需要用到成员变量子类的)
若一个类是函数子,则应使它可配接
继承相关的模版,如binary_function<….>,unary_function
理解ptr_fun,mem_fun,mem_fun_ref
参数格式化,mem_fun-调用成员函数,mem_fun_ref-使用指针调用成员函数,ptr_fun -将函数变成可配接的
了解排序相关的算法
partial_sort,sort,qsort,nth_elemetn,(非稳当的),stable_sort
ps:list的成员函数sort是稳定的排序
3.关联容器
为包含指针的关联容器指定比较器
默认的比较器比较的是指针的地址,而不是指针所指的东西。可以使用binary_function定义一个比较器,如:
struct Stringptrlesss : binary_function < const string*, const string*, bool >
{
bool operator() (const string* q, const string* w){ return *q < *w; }
};
然后将该比较器设置为容器的比较器,如:set<string *, Stringptrlesss > ssp;
总是让比较函数在等值情况下返回false
一般情况下,如果比较函数在等值情况下返回true的话,导致容器无法正确的判等,容器的判等逻辑为:a不小于b,且b不小于a,即:!