STL 乱学二(原创)
1.容器
顺序: vector(类似动态增长数组) deque (双端队列) list(双头指针)
关联:set multiset(有重复) map multiset(有重复) ,自动排序(内部2叉树)
特殊预定义容器:stack, queue ,prority queue
2.迭代器
每种容器都提供了自己的迭代器,相同的操作界面,不同的内部实现,
*,->,==,!=,++,--共同操作
随机iterator : 支持 >,<:如:vector, deque,string
双向iterator:不支持>,<:
特殊预定义:
插入迭代器
insert iterator:引起自动增长,非覆盖
back_inserter(container)
front_inserter(container)
inserter(container,pos)//调用 container.insert()//每种容器都具有insert()//关联容器唯一
流迭代器
istream_iterator
ostream_iterator
逆向迭代器
容器中元素应满足:
有拷贝构造,赋值运算符,析构能销毁
顺序:默认构造应该可用
关联:必须有排序准则
容器中是 值不是引用
通用操作:
containertype c;
ct c(c1);
ct c(begin,end);
c.~ct();
c.size(), c.max_size(),c.empty(),c1==c2;c1<c2;c1.swap(c2); swap(c1,c2);c.begin();c.end();c.rbegin();c.rend();
c.inert(pos,elem);c.erase(begin,end),c.clear(),c.get_allocator
3.vector
动态增长数组,在队尾插入,删除效率高
注意 动态增长时 迭代器失效 内部可能要重配置
除了clear(),vector 不会自动缩小
vector 的迭代器 就是 元素的native指针,连续存储,迭代器是个random
空判断
a.begin==a.end
4.list
迭代器是个双向的,非连续存储,而且是个环状链表在尾端是个未初始化节点
空判断
a.begin==a.end;
clear remove unique(把相同元素移出,留一个) insert
只能使用成员函数 sort,不能使用 算法 sort(他只接受random iterator)
5 .deque
动态增长的双端队列 ,但内部机制和vector 不一样 ,若干连续存储的集合
算法复杂度高,如排序时可将 其复制到 vector中,头/尾插入/删除效率高 ,
提供随机迭代器
6.stack (container adapter)
先进后出,不供迭代器, 不提供走访功能
7.queue(container adapter)
先进先出,不提供迭代器,不提供走访功能
8.heap 辅助
其内部为一个完全2叉树,插入时自动排序,一般为max_heap
左右无序,某节点 i, 父节点 i/2,左子节点 2i,右子节点 2i+1;
template<class RandomAccessIterator> inline void make_heap( RandomAccessIterator First, RandomAccessIterator Last )template<class RandomAccessIterator> inline void sort_heap( RandomAccessIterator First, RandomAccessIterator Last )template<class RandomAccessIterator> inline void push_heap( RandomAccessIterator First, RandomAccessIterator Last )template<class RandomAccessIterator> inline void pop_heap( RandomAccessIterator First, RandomAccessIterator Last )
9.set,关联容器 ,底层以rb-tree 实现,其迭代器为个const iterator
不能用迭代器来改变 元素值,缺省下以递增排序