定义一个数组:char buff[1024];当我们用指针char
*p(char *p = buff)遍历数组时,指针p指向一维数组首元素地址,每次都是从数组第一个元素的偏移到指定位置,即进行指针运算。例如:访问p[100]时,需要p+100,这样浪费时间,影响效率。因此,我们引入迭代器概念。
一、迭代器介绍
迭代器iterator提供了对顺序或关联容器类型中的每个元素进行连续访问的方法。
注意:
1.每个对象都有一个,即容器与迭代器之间互相绑定。
2. 迭代器迭代元素时必须知道底层的数据结构,数组or链表,因此实现成嵌套类。
3. 每种容器都要提供iterator begin()和iterator end()。
4. iterator begin()指向容器第一个元素,iterator end()指向元素末尾下一个位置。
5. 迭代器只能读取元素,不能修改元素。
二、迭代器的使用
1.简单的字符串迭代
#include<iostream>
using namespace std;
int main()
{
string str = "sjdvbsszbk";
string::iterator it1 = str.begin();//前面必须具有作用域,调用必须依赖对象
string::iterator it2 = str.end();
for(;it1 != it2;++it1)
{
cout<<*it1<<" ";
}
cout<<endl;
return 0;
}
输出:
s j d v b s s z b k
2.迭代容器的内容
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
for(int i = 0;i < 10;i++)
{
vec.push_back(rand()%100);
}
vector<int>::iterator it1 = vec.begin();
vector<int>::iterator it2 = vec.end();
for(;it1 != it2;++it1)
{
cout<<*it1<<" ";
}
cout<<endl;
return 0;
}
输出随机数:
41 67 34 0 69 24 78 58 62 64
3.自定义类型迭代
#include<iostream>
using namespace std;
template<typename T>
class CMyString
{
public:
CMyString(T *p = T()):_str(p){}
int size()
{
return strlen(_str);
}
class iterator
{
public:
iterator(T *p = T()):_pcur(p){}
bool operator!=(const iterator &src)
{
return _pcur != src._pcur;
}
void operator++()
{
++_pcur;
}
//对于[],*,->要提供两种版本
T operator*()
{
return *_pcur;
}
const T operator*()const
{
return *-pcur;
}
private:
T *_pcur;
};
iterator begin()
{
return iterator(_str);
}
iterator end()
{
return iterator(_str+size());
}
private:
T *_str;
friend ostream& operator<<<T>(ostream &,const CMyString<T> &);
};
template<typename T>
ostream& operator<<(ostream &out,const CMyString<T> &src)
{
for(int i = 0;i < src.size();++i)
{
out<<src._str[i]<<" ";
}
return out;
}
int main()
{
CMyString<char> str("sjdkvalnlsd");
CMyString<char>::iterator it1 = str.begin();
CMyString<char>::iterator it2 = str.end();
for(;it1 != it2;++it1)
{
cout<<*it1<<" ";
}
cout<<endl;
return 0;
}
输出:
s j d k v a l n l s d
从此例中,我们可以清楚的看到,编写自定义类型迭代器时,需要实现以下方法:
(1)operator!=()
(2)operator ++()
(3)operator*()