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> >


posted on 2011-01-30 10:09  cvbnm  阅读(409)  评论(0)    收藏  举报

导航