感觉自己对STL的很多东西还是不够明确,趁这个机会把这些内容整理一下,顺便明确化一些模糊的点.
STL六大组件 容器,算法,迭代器,仿函数,适配器,分配器. 基本也是按照常用顺序排列
容器,现在理解起来就是数据的组织方式.
数组,原生数组
vector用于替代原数组,一定程度上解决了数组开大了浪费,开小了不够的问题.vector实现动态增加的方式很简单,大小不够了,就重新拷贝到一块新的更大的空间,默认是1.5倍原大小
注意:vector内部自动扩容的时候会将原空间析构,重新开辟的新空间会拷贝构造原值. 这使得对拷贝构造,析构有要求的自定义类型要注意.比如计数智能指针.
而且很容易想到,如果是大类型,每一次扩容会产生不少的性能损耗,必要的时候 可以通过reserve方法指定大小,避免小空间时频繁拷贝构造析构,甚至有时要自己写个memcpy的浅拷贝vector
vector的方法,想出来一个算一个, push_back(),尾插入一个元素,会拷贝构造插入对象,参数是const引用, c++11中建议用emplace_back替代,emplace_back会在尾位置构造.也就是说,当explicit修饰了有参构造的化,push_back(参数)是编译不通过的,而emplcae_back(参数)可以,如图, 当容量大于size时,非基本类型e_p效率高于p_b,容量不够,都会先开辟新空间
我就觉得根本没有什么明确的六大组件什么的.或许这也是STL的无奈.STL中并不是全部都是界限明确的.比如,bitset,位图,就没法弄出迭代器,更别说sort什么的, 如果说,迭代器算法是专属STL设计的,那么为什么普通数组也可以调用 algorithm中的sort(),实际中传入指针而不是迭代器就行,又比如string,也有自己的迭代器.....那么string也是STL一部分吗???我思来想去,只能说明,STL是不断地修修补补,不去纠结界限分明,只要好用就行,实际上来说,我觉得这是一个非常浩大艰巨的工程,能做到这个程度,尽可能的方便后人,通用,非常了不起了.
甚至我觉得应该把STL融为语言的本身,能更好的解决更多问题.可以也许是受限于"0代价抽象"又或是"包罗万象",C++在某些问题上显得非常纠结,比如STL另一个巨坑----默认的STL是会抛异常的,比如stack已经空的时候仍然pop,这使得在写某些代码的时候要小心谨慎,或者禁用异常,(好像是加入一些宏定义)
vector的常用操作
v1.push_back() //在数组的最后添加一个数据 v1.pop_back() //去掉数组的最后一个数据 v1.front() //返回第一个元素(栈顶元素) v1.begin() //得到数组头的指针,用迭代器接受 v1.end() //得到数组的最后一个单元+1的指针,用迭代器接受 v1.clear() // 移除容器中所有数据 v1.empty() //判断容器是否为空 v1.erase(pos) //删除pos位置的数据 v1.erase(beg,end)// 删除[beg,end)区间的数据 v1.size() //回容器中实际数据的个数v1.insert(pos,data) //在pos处插入数据
我个人觉得vector可以替代stack,而且还能在某些场景下遍历,比如我常常遇到的DFS到底的时候输出,stack就是少打个_back吧
vector使用时始终要记得,它本质还是个数组
我所遇到的vector的坑点也就在上面写到了,以后遇到其他再添加吧
原文地址:https://www.cnblogs.com/slowman/p/10111639.html