c++序列容器之‘个性’


一.vector

vector满的时候,动态内存分配的问题

原则:新分配的空间是原来空间的2倍,以减少内存分配的次数。

.capacity() 可以得到当前内存分配的容量。


插入个数与内存分配大小的配合情况大致如下:


插入数据的个 数 : 0 1 2 3 4 5 6 7 8 9 ...

当 前    容 量 :  0 1 2 4 4 8 8 8 8 16 ...


可以在分配内存之前预约容量:

.reserve(n);


vector还支持下标访问元素:

.operator[](i) 越界不做检查

.at(i)  越界会做检查 返回异常类型为 exception

try{} catch(exception& e){ cout<<e.what()<<endl;

                 cout<<typeid(e).name()<<endl;}


使用vector还能实现二维数组:

如:vector<vector<int> > (注:最后两个尖括号要写开)

实例一下:

int x=4,y=6;

vector<vector<int> > vvi(x,vector<int>(y))

(vector 的构造函数支持2个参数,元素个数,元素值=0)

如果想要扩充,也可以:

扩充行:vvi.resize(x+3);

扩充列:

比如:vvi[1].assign(8,3) 第2行扩展为8列,每个元素的值为3

(这样c++仿佛也实现了c#中的不规则数组,是不是很强大?而且有专用的成员函数,是不是很方便?)



二.deque

double-ended queue 双端队列

也支持 .operator[](i) .at(i)

但是不支持 .capacity() .reserve()

增加删除:.push_front() .pop_front()  在对头增删

        .push_back  .pop_back()

所以这个双端队列是支持前后插入和删除的

(vector只支持.push_back .pop_back() 尾部插入删除)

(.insert()不考虑在内)


三.list

只支持从前面插入和删除 .push_front .pop_front()

.remove(element) 删除所有元素值为element的元素

不支持 [] 下标运算


排序函数 .sort(compare func=less)

支持自定义的函数 默认比较符号 <

倒置 .reverse()


把list1链表的数据移动到list2(注意:移动之后list2就空了)

list1.splice(pos,list2)

list1.splice(pos,list2,pos2)

list1.splice(pos,list2,pos_beg,pos_end)

移动一段数据(移动了的数据,原链表里就没了)


链表的归并:

list1.mege(list2)

注意:list1和list2一定是已经排好顺序的


list的sort()函数支持自定义的比较算法。

系统默认是小于。

还可以使用大于 如 sort(great<int>())

great<int><> 是系统自带的比较函数模板

自定义:

如:%5的结果再比较

bool compare(int x,int y){

       x%=5;

       y%=5;

       return x<y;

}

(当然也可以定义成模板)