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种迭代器类型:
输入迭代器 只读,不写,单遍扫描,只能递增
输出迭代器 只写,不读,单遍扫描,只能递增
前向迭代器 可读写,多遍扫描,只能递增
双向迭代器 可读写,多遍扫描,可递增递减
随机访问迭代器 可读写,多遍扫描,支持全部迭代运算
(全文完)
1088

被折叠的 条评论
为什么被折叠?



