C++迭代器理解與例項詳解
阿新 • • 發佈:2019-02-13
定義一個數組: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*()