STL 顺序容器注意事项

来源:互联网 发布:linux dns 添加mx记录 编辑:程序博客网 时间:2024/05/17 01:56

顺序容器就是指vector, list, deque.

1.构造函数

设C为上面三种容器中的一种,则构造函数有如下5种

1.C<T> c; //T是元素类型,容器初始化为空,例如vector<int> vec;

2.C<T> cc(c); //创建容器cc,复制c的值到cc.两者必须具有相同的容器类型.例如vector<int> vec; vector<double> vt(vec);会出错

3.C<T> c(start, end); //创建一个容器,然后从另外哪个容器的两个迭代器区间拷贝元素.两种容器可以不一样.但是元素类型要匹配

                      //例如vector<int> vec;  list<int> lt( vec.begin() , vec.end() );

4.C<T> c(n,val);  //创建容器,有n个值,每个值都为val,val的类型不一定要和T一样,但要可转换.例如vector<int> vec(3, 1.0);

5.C<T> c(n);      //创建容器,有n个值,全部默认为0值.

补充: 实际上前三种构造函数,关联窗口也可以用.但4,5种构造函数只有顺序容器才可以用.

另外容器适配器的构造函数只有两种.

queue<int> qu; //方法1

queue<int> que( qu._Get_container); //把qu复制过来.因为queue实际上是用deque实现的.所以这个构造函数等同于.deque<int> que(qu);

 

2.容器元素类型约束

所有内置的的类型都可以做为容器元素,但是唯一例外的是引用(它不支持一般意义上的赋值),指针也可以做为容器元素.如果自定义的类型,必须符合下面两个条件

支持赋值运算

类型对象必须可复制

 

 

3.vector, deque迭代器的特殊用法

容器适配器(stack, queue,priority_queue)是没有迭代器的.而顺序容器与关联容器都有迭代器,一般的迭代器只支持如下一些简单操作:

*iterator , iterator->item,

iterator++ , iterator--, ++iterator, --iterator , 

iterator1 != iterator2 , iterator1 == iterator2

 

但vector , deque这两容器的迭代器还有些特殊用法,原因嘛是因为这两者都是用动态数组实现的,所以它们的迭代器会有和数组下标类似的操作.

有如下特殊用法:(概括起来就两大类:算术运算和大小比较)

iterator + n 或者iterator - n //迭代器后面n位或前面n位的元素位置

iter1 += iter2

iter1 - iter2;

> , >= , < , <= //数组下标在后面比前面的下标大嘛.

 

反正想下数组下标就是些从小排列到大的数字,而vector和deque的迭代器和数组下标类似,这样一想很容易理解上面的特殊用法了.

 

迭代器失效

迭代器就类似于一个指针,我们知道当指针指向的内存区域如果被释放了,则指针变成野指针了.同样如果迭代器指向的的元素的变更了(被删除了,或者移动了),也就是比如执行了pop_back() , erase之类的操作.而使用迭代器的时候没办法去判断它是否失效.所以使用的时候得自己小心了啊.

 

 

容器的选择

一般没啥特殊需求的话用vector就行了.

需要经常插入删除的就用list,即需要随机访问,又需要在首尾两端插入删除就用deque.

如果只就是在刚开始初始化容器时需要作些插入操作,后续的操作则都是访问元素.则可以先用list完成初始化,然后将list中的元素拷贝到vector中