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;
}
(当然也可以定义成模板)