c++数据结构和算法
STL(标准模板库)
STL标准模板库,是一系列软件的统称。从根本上说,STL是一些“容器”的
集合,这些容器有list vector set map等,STL也是算法和其它一些组件的集合。
前面学习的sort string都是STL的内容。
算法:对一些编程中常用的算法,STL提供了通用的函数供程序员直接调用。比如
遍历(for_each)、查找(find)、二分查找(binary_search、lower_bound、upper_bound)
去除重复(unique)、填充(fill)、前一个排列(pre_permutation)、下一个排列
(next_permutation)、排序(sort)等。
模板:我们以前编写的函数中,参数的类型都是确定的,这个特点极大限制了函数
的通用性。比如C语言中求一个数的绝对值函数,整数是abs,长整数是labs,浮点数是
Fabs。STL中使用模板技术,统一为abs函数。
向量(vector)
1.vector的定义
cpp Vector<typename> name
以上定义相当于定义了一个一维数组name[size],只是size不确定,其长度可以
根据需要而变化。其中,typename可以是任何基本类型,如int、double、char、
结构体等,也可以是STL标准容器,如vector、queue等。例如:
vector a;
vectorscore;
vectorstu;//node为已经定义的结构体。但是如果typename也是一个STL
容器,那么定义时需要在两个‘>’的符号之间加上一个空格,因为“>>”在
编译器里会被作为“移位”操作,从而导致编译错误。例如:
vector<vector > a;
2. vector的访问
问vector中的元素一般有两种方式:
第一种是通过“下标”访问。例如,对于容器vector v,可以使用v[index]
来访问它的第index个元素。其中,0<=index<=v.size()-1,v.size()表示vector中元素
的个数。
第二种方式是通过“迭代器”访问。可以将“迭代器(iterator)”理解为一种
类似指针的变量。其定义为:
vector::iterator it;
这样,it就是一个vector::iterator型的变量。例如:
vector::iterator it;
就是定义一个迭代器it,并且可以通过“it”来访问int类型的vector里的元素。
例如:
vector::iterator it=v.begin();//v.begin()为取v的首元素地址,而it指向这个地址,
相当于v[0]。v[i]和(v.begin()+i)是等价的。
for(int i=0;i<=5;i++)
printf(“%d”,*(it+i));//输出v[i];
在常用的STL容器中,只有vector和string允许使用“v.begin()+3”这种迭代器加上整数
的用法。同时,迭代器也可以进行自加、自减操作,即it++,++it,it–,--it;
例如:
For(vector<int>::iterator it=v.begin();it!=v.end();it++)
printf(“%d”,*it);//输出v[i];
需要注意的是:v.end()并不是取v的尾元素地址,而是尾元素地址的下一个地址,作为
迭代器末尾标志不存储任何元素。但是,vector迭代器并不支持“it<v.end()”
的写法。
3.vector的常用函数
前面已经介绍了两个vector函数:begin()和end()。需要注意的是,这是一种左闭右开
的表示方法。下面介绍其它几个常用的vector函数。
1、push_back()
push_back(x)用来在vector后面添加一个元素x,时间复杂度为O(1)。
2、size()
如果是一维数组,size()用来获取vector中元素的个数;如果是二维数组,size()用来
获得vector中第二维的元素个数。同时,还可以使用resize(n)重设数组的大小。
例如:
vector<int> v