【学习笔记】C++高级程序设计:STL标准模板库(2)

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;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值