STL容器
1. 测试容器时不仅要测试基本数据类型,还要测试自定义类和结构体
STL容器内部结构各有不同,但尽量保持外部界面相近。迭代器作为粘合剂,可以粘接容器和演算法,甚至可以粘结容器与容器。
通用接口:
1. 获取首尾: 迭代器=begin();end();(前包后闭] T&=front();back();(首尾数据)
2. 容量大小: size(); empty();
3. 存取数据的基础: insert(iter, T&); erase(iter);
insert(iter, iter1,iter2); erase(iter1,iter2); //传递一个iter区间,都是前闭后包
insert(T*); //T指针可以骗过编译器,但绝不是容器的本意
insert(容器);
这两个操作,具体实现因应容器内部结构的不同而不同。
4. 存取数据: push_back(T&); pop_back(); clear();
{ insert(end(), T&);} {erase(end() - 1); } {erase(begin(), end()); } //操作iter区间,也是前闭后包
5. 赋值: assign(size_t); //缺省值 { erase(begin(), end());
assign(size_t, T); insert(begin(), 传参); }
assign(iter1, iter2);
assign(容器);
6. 构造: 构造();
构造(size_t); //不推荐,分配同时占用了空间
构造(size_t, T&);
构造(iter1, iter2);
构造(容器); //在某些情况下使用
std::vector<T,std::alloc<T> >
特点: vector有容量的概念: capacity();
扩充容量: 构造(); + reserve(size_t); resize(size_t) //vector的resize为配合其它容器的动作,和你想的绝对不一样
压缩容量,这里用到两个不常用的操作和临时变量(见《由压缩一个臃肿的STL Vector操作引发的思考》):
std::vector<T> (vec).swap(vec);
operator[]();
std::deque<T,std::alloc<T> > double-end queue
没有另一个容量,size()就是size。在这里resize()有了一定意义,没有reserve,以后的容器也没有。
也是一段连续空间,但实现更复杂,可以前后存取数据 push\pop_front\back()。
也重载了[]运算符
和原先想的不一样,连续空间容器也有insert和erase。在一定条件下有效率的操作,STL还是提供了,除了像肯定没效率的vector队首push\pop
std::list<T,std::alloc<T> >
size()就是size,只有resize()
无[]运算符
特点:
remove(T); //函数里用到了 ==T 判断,如果T为非基本数据类型,就要重载operator==();非自定义类型可以继承
列表相关操作:
merge; sort;//需要重载operator<() splice(); unique();//重载operator==(),先sort()
排序、判断删除,也可以用演算法。
插入删除: 元素位置由容器内部的一套规则制定,没有push_back,insert(iter, T) 等显式的确定位置的插入删除操作。
insert(T);
insert(iter1, iter2);
insert(iter, T) //等同于insert(T),没有insert(iter,iter1, iter2),不接受3个参数
添加数据时就比较T的大小确定位置了。T需要重载:
bool operator<(const T&) const; 注意:set的 T 重载的<运算符要求2个const,不然编译出错
erase(T\iter\iter1,iter2);
删除数据时要比较键值,T需要重载==运算符。
查找: 二叉树的优势在于快速查找,它没有[]运算符,一般也不用iter遍历。提供find(T)查找需要的值,运算复杂度为对数时间log(N)。
集合操作: set_union(); set_intersection(); set_diffrence(); key_comp(); value_comp(); upper_bound(); lower_bound();
其它容器配接器:
std::stacks<T> std::queues<T> std::priority_queues<T>
构造: 内部是红黑树,值即是键。multiset允许键不唯一。
构造();
构造(iter1,iter2); //可以使用其它容器的iter,只要T一致。如set(vector.begin(), vector.end());
std::set<T,std::alloc<T>,std::less<T> >