这里讲解几种常用的STL函数
一:vector
vector的优势显而易见,首先可以无限制自动调整数组长度(~~妈妈再也不用担心我MLE了~),然后还能用任意类型来开数组,在很多算法都会用到
#####(暴力应该不算吧。。。)
#### vector 使用方法:
vector<int> a; //定义了一个整型不定长数组a
vector<double> score; //定义了一个双精度浮点型不定长数组score
vector<node> stu; //定义了一个结构体类型的不定长数组stu
以上定义相当于定义了一个一维数组name[size],只是size不确定,其长度可以根据需要而变化。其中,typename可以是任何基本类型,如int、double、char、结构体等,也可以是容器。
注意:如果typename也是一个STL容器,那么定义时需要在两个“>”符号之间加一个空格,不然编译器会误认为是位运算的右移符号“<<”,例如:
vector<vector<int> > a; //定义了一个两个维度都可变的二维整型数组a
vector<int> a[100]; //定义了一个第一维长度为100,第二位不限长度的二维数组a
vector的访问:
访问vector中的元素一般有两种方式:下标访问 和 迭代器(iterator)访问。
第一种是通过“下标”访问的。例如,对于容器vector<int> v,可以使用v[index]来访问它的第index个元素。其中,0≤index≤v.size() – 1,v.size()表示vector中元素的个数。
第二种是通过“迭代器”访问的。可以将迭代器理解为一种类似指针的变量,使用前需要提前定义,其定义为:vector<typename>::iterator it,这个it就是一个迭代器,可以通过“*it”来访问该容器里的元素值,下面举个例子:
vector<int>::iterator it = v.begin(); //定义一个迭代器it,初始化为容器v的首元素地址,这是*it相当于v[0],*(it + i)相当于v[i]。
迭代器还可以进行自加自减操作,如it++,++it,it--,--it,注意:迭代器不支持“it<v.end()”的写法,只能是“it != v.end()”, v.end()并不是取v容器尾元素地址,而是尾元素下一个地址。
例:for(vector<int>::iterator it = v.begin(); it != v.end(); it ++) printf(“%d”,*it);
lower_bound返回二分查找在去重排序数组中第一个等于或大于num[i]的值的地址 - 数组首地址。
upper_bound返回的是最后一个大于等于val的位置,也是有一个新元素val进来时的插入位置 -数组首地址.