不定长数组vector
定义
不定长数组就是可以在程序中随意更改数组长度的一种STL。
优点
正如字面上理解,不定长数组,就是长度没有确定的数组,这样可以最大限度地节约空间,而且作为一个独立的类型,vector还有自己特色操作。
如何定义
怎么定义一个int类型的vector:
vector<int>a;
如何取用元素
vector类型和数组非常的相像,支持下标,例如a[n]。
基本操作
- int len=a.size();取用a的长度;类似于数组的sizeof();//对于所有的容器都生效
- a.resize(100);给a分配100个空间,下标是0~99;
- a.push_back(234);向a的尾部添加一个元素234;
- a.pop_back();a的末尾删掉一个元素;
- a.clear();清空a;
- a.empty();判断a是不是空的;//对于所有的stl容器都生效
- a.begin()是一个头指针;a.end()是超尾指针(左闭右开区间);
vector排序
和一般的数组一样,vector也可以用系统内置快排sort
不过写法不太一样。
下面给个例子,加入要给a这个int类型的vector排序:
sort(a.begin(),a.end());
这样就完成了对a的排序。(默认从小到大)
vector不定长内部实现
如果你没有给vector定义多长的空间,或者你开的空间过小,但是你仍然在用push_back,会不会有溢出风险?答案是不会。如果你存了n个元素,它的空间是二的幂,而且>=n,<=2n;这玩意儿类似于倍增的思想,如果溢出就开多一倍的空间。
队列queue
队列没有clear操作
队列的clear操作应自己手写。
while(q.size())q.pop();
这样啊就可以实现队列q的清空操作。
一些操作
a.size()
a.clear()
a.empty()
a.pop()
a.front()
a.push()
deque双向队列
q.push_front()
q.push_back()
q.pop_fr
q.pop
set元素不重复的集合
struct poi
{
double x,y;
int id;
poi(){};
poi(double x_,double y_)
{
x=x_,y=y_;
}
};
bool operator<(poi a,poi b)
{
return a.x+eps<b.x||a.x<b.x+eps&&a.y<b.y;
}
set<rec>s;
multiset多重集
lower_bound()
upper_bound()