STL学习(2)
不同容器的迭代器种类是不同的
Vector:随机访问迭代器(给下标直接访问某元素)
Deque:随机访问迭代器
List:双向迭代器(无法实现随机访问)
Set/multiset:双向迭代器
Map/multimap:双向迭代器
Stack:不支持迭代器(不能访问中间的元素,不能遍历整个容器)
Queue:不支持迭代器
Priority_queue:不支持迭代器
有的算法:sort,binary_search需要通过随机访问迭代器来访问容器中的元素,那么list以及关联容器就不支持该算法。
算法简介
算法就是一个个函数模板,大多数在<algorithm>中定义
STL中提供能在各种容器中通用的算法,比如查找,排序等
算法通过迭代器来操纵容器中的元素。许多算法可以对容器中的一个局部区间进行操作,因此需要两个参数,一个是起始元素的迭代器,一个是终止元素的后面一个元素的迭代器,比如,排序和查找。。
有的算法返回一个迭代器。比如find()算法,在容器中查找一个元素,并返回一个指向该元素的迭代器。
算法可以处理容器,也可以处理普通的数组。
算法实例find()
Template<class Init,class T>
Init find(Init first, Init last,const T& val);
Find在[first , last)查找等于val的元素
用==运算符判断相等
函数返回值是一个迭代器。如果找到,则该迭代器只想被找到的元素。如果找不到,则该迭代器等于last
示例代码:
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main(){
int array[10]={10,20,30,40};
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
vector<int>::iterator p;
p=find(v.begin(),v.end(),3);
if(p!=v.end()){
cout<<*p<<endl;
}
p=find(v.begin(),v.end(),9);
if(p==v.end())
cout<<"not found"<<endl;
p=find(v.begin()+1,v.end()-2,1);
//查找区间为 [2,3)
if(p!=v.end())
cout<<*p<<endl;
int *pp=find(array,array+4,20);
cout<<*pp<<endl;
return 0;
}
注意:V.end()指向最后一个元素后面的元素。
STL中“大”、“小”的概念
关联容器内部的元素是从小到大排序的。
有些算法要求其操作的区间是从小到大排序的,称为“有序区间算法”例如:binary_search
有些算法会对区间进行从小到大排序,称为“排序算法”例如:sort
还有一些其他算法会用到“大”、“小”的概念
使用STL时,在缺省的情况下,以下三种说法等价:
1. x比y小
2. 表达式“x<y”为真
3. Y比x大
有时,“x和y相等”等价于“x==y为真”例如:在未排序的区间上进行的算法,例如顺序查找find
有时:“x和y相等”等价于“x小于y和y小于x同时为假”
例如:有序区间算法,如:binary_search
关联容器自身的成员函数find
STL“相等”概念的代码示例
#include <iostream>
#include <alogrithm>
using namespace std;
class A{
int v;
public:
A(int n):v(n){
}
bool operator < (const A &a2)const {
cout<<v<<"<"<<a2.v<<"?"<<endl;
return false ;
}
bool operator == (const A &a2)const {
cout<<v<<"=="<<a2.v<<"?"<<endl;
return v==a2.v;
}
};
int main(){
A a[]={A(1),A(2),A(3),A(4),A(5)};
//折半查找
cout<<binary_search(a,a+4,A(9));
return 0;
}