C++迭代器

C++迭代器

一、迭代器简介

通俗的说,迭代器就是可以代替使用下标运算符访问string等对象的另一种通用机制。

迭代器类型有两个成员分别是begin和end,end返回的迭代器往往被称作尾后迭代器,

注:如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器。

迭代器的一些基本使用示例代码:

#include<iostream>
using namespace std;
int main(){
	string s("I am a good man!!!");
	auto a=s.begin(),b=s.end();//b指向迭代器的最后一个的下一个 
	cout<<*a<<" "<<*b<<endl;
	++a;
	--b;
	if(a!=b)
		*b=toupper(*b);//将最后的字母转换成大写 
	cout<<s<<endl; 
	for(auto it=s.begin();it!=s.end();++it){//&&!isspace(*it)
		*it=toupper(*it);
	} 
	cout<<s<<endl; 
	//迭代器类型
	string s1("nice to me you too!");
	auto it1=s1.begin();
	auto it2=s1.cbegin();//c++11标准新引入的函数 不论对象本身是否是常量 返回值都是const_iterater,只能对不能写
	if((*it1).empty())cout<<"No empty!";//同样也可以使用it1->empty() 
	 
	return 0;
} 

使用迭代器进行运算(使用迭代器的经典二分搜索算法):

autobeg=v.begin(),end=v.end();
automid=v.begin()+(end-beg)/2;//mid指向中间的迭代器
while(mid!=end&&*mid!=sought){
       if(sought<*mid)end=mid;//向左半部分缩小搜索范围
       else beg=mid+1;//向右半部分缩小搜索范围 
       mid=beg+(end-beg)/2;//重新获取中间元素位置
}

注:关于迭代器失效

两限制:1、不能再范围for循环中间vector对象添加元素;

                2、任何一种可能改变vector对象容量的操作都可能是容器操作失效。

 

二、几个额外的迭代器

1、 插入迭代器

差异与插入方式的三种类型:

(1)、back_inserter从尾部插入,创建一个使用push_back的迭代器

(2)、front_inserter创建一个使用push_front的迭代器

(3)、inserter 创建一个insert的迭代器

2、 流迭代器(iostream迭代器)

iostream迭代器的构造函数:

istream_iterator<T> in(strm);

创建从输入流strm读取T类型对象的istream_iterator对象

istream_iterator<T>in;

istream_iterator对象的超出末端迭代器。

ostream_iterator<T>out(strm);

创建将T类型的对象写到输出流strm的ostream_iterator对象

ostream_iterator<T>out(strm,delim);

创建将T类型的对象写到输出流strm的ostream_iterator对象,在写入过程中使用delim作为元素的分隔符。delim是以空字符结束的字符数组。

示例代码:

#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
int main()
{
	istream_iterator<int> int_in(cin);//当输入不是int类型时结束输入 
	istream_iterator<int> int_eof;
	//vector<int> vec(int_in, int_eof);
	vector<int> vec;
	while (int_in!= int_eof)
	vec.push_back(*int_in++);
	vector<int>::iterator it=vec.begin();
	while (it!=vec.end()) {
		  cout << " " << *it++;
	}
	cout << endl;
	return 0;

}

#include <iostream>
#include <iterator>
#include <string>
using namespace std;
int main()
{
	ostream_iterator<string> out_it(cout, ":out\n");//输出迭代器 
	istream_iterator<string> in_it(cin),eof;
	while (in_it!=eof) {		
		*out_it= *in_it;
		++out_it;	
		++in_it;	
	}	
	return 0;
}


3、 反向迭代器

反向迭代器是在容器中从尾部向首元素反向移动的迭代器

#include<iostream>
#include<vector>
using namespace std;
int main(){
	vector<int> v({0,1,2,3,4,5,6,7,8,9,10});
	for(auto it=v.crbegin();it!=v.crend();++it)cout<<*it<<" ";
	cout<<endl;
	for(auto it=v.rbegin();it!=v.rend();++it)cout<<*it<<" ";
	return 0;
}

4、 移动迭代器

 迭代器适配器生成一个迭代器,该迭代器移动而不拷贝元素。

三、算法所要求的可分为5种迭代器类型:

输入迭代器               只读,不写,单遍扫描,只能递增

输出迭代器               只写,不读,单遍扫描,只能递增

前向迭代器               可读写,多遍扫描,只能递增

双向迭代器               可读写,多遍扫描,可递增递减

随机访问迭代器           可读写,多遍扫描,支持全部迭代运算

(全文完)

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值