c++迭代器介紹
阿新 • • 發佈:2019-02-01
迭代器的簡介
- 迭代器類似於指標型別,它也提供了對物件的間接訪問。
- 指標是c語言中就有的東西,迭代器是c++中才有的,指標用起來靈活高效,迭代器功能更豐富些。
- 迭代器提供一個對容器物件或者string物件的訪問的方法,並且定義了容器範圍。
使用迭代器
迭代器和指標不一樣,容器和string有迭代器型別同時擁有返回迭代器的成員。比如,容器都有的成員begin和end,其中begin成員複製返回指向第一個元素(第一個字元)的迭代器,而end成員返回指向容器(或string物件)尾元素的下一個位置的迭代器,也就是說end指示的是一個不存在的元素,所以叫end返回的是尾後迭代器。一般我們清楚一個迭代器的準確型別是什麼,所以我們都是使用auto或者decltype來定義變數的。
vector<int> v;
auto b=v.begin();
decltype(v.begin()) b=v.begin();
標準容器迭代器的運算子
*iter 返回迭代器iter所指元素的引用
iter->men 解引用iter並獲得該元素的名為men的成員,相當於(*iter).men
++iter 令iter指示容器的下一個元素
--iter 令iter指示容器的上一個元素
iter1==iter2 如果兩個迭代器指示的是同一個元素或者它指向同一個容器的尾後迭代器,則相等.
下面給出一個使用迭代器運算子修改容器元素的程式碼示例:
#include<iostream>
using namespace std;
#include<vector>
int main()
{
vector <int> v(10, 1);
int i=1;
cout << "未修改前:";
for (auto v_quote : v)
{
cout << v_quote << " " ; //未修改前
}
cout << endl;
for (auto v_quote = v.begin(); v_quote != v.end(); ++v_quote)
{
*v_quote += i;
++i;
}
cout << "修改後:";
for (auto v_quote : v)
{
cout << v_quote << " ";
}
cout << endl;
system("pause");
return 0;
}
迭代器的型別
那些擁有迭代器的標準庫型別都是使用:iterator和const_iterator來表示迭代器的型別:
vector <int> ::iterator it; //it能讀寫vector<int>的元素
vector <int>::const_iterator it; //it只能讀vector<int>的元素,不可以修改vector<int>中的元素
string::iterator s; //s可以讀寫string物件中的元素
string::const_iterator s; //s只可以讀string物件中的元素,不可以修改string物件中的元素
const_iterator和常量指標一樣,只可以讀取但不可以修改所指的值。在c++11的新標準中,為了便於得到const_iterator型別的返回值,引入兩個新的函式,分別是cbegin和cend,功能類似於begin和end,只是返回的值型別為const_iterator;
vector動態增長的限制:
- 不能再範圍for迴圈中向vector物件新增元素。
- 任何一種可能改變vector容量的操作,比如push_back,都會使該vector物件的迭代器失效。
迭代器的運算
iter+n //迭代器加上一個整數值仍得到一個迭代器,迭代器指示的新位置向前移動了,指示可能是容器的一個元素或者是尾部的下一個位置
iter-n //相反,迭代器指示的位置向後移動了,指示可能是容器的一個元素或者是尾部的下一個位置
iter1+=n //等價於iter1+n
iter1-=n //等價於iter2-n
iter1-iter2 //兩個迭代器的距離,
兩個迭代器返回的值,在string和vector都為它定義了一個新的型別–difference_type,它是一個帶符號的整型。
使用迭代器運算的一個經典演算法是二分查詢,程式碼如下:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
int main()
{
vector <int> v{ 1,20,10,5,6,7,90 };
cout << "請輸入需要查詢的值:";
int temp = 0;
cin >> temp;
sort(v.begin(), v.end()); //使用排序函式對容器vector中的元素進行排序
auto beg = v.begin();
auto end = v.end();
auto mid = v.begin()+ (end - beg) / 2;
/*
二分查詢法:
每次都拿中間的那個值和需要查詢的值做比較,如果相等就退出查詢
如果查詢的值比中間那個值小,則向前查詢
如果查詢的值比中間那個值大,則向後查詢
*/
while (mid != end && * mid != temp)
{
if (temp < *mid)
{
end = mid;
}
else
{
beg = mid+1;
}
mid = beg + (end - beg) / 2;
}
if (* mid == temp)
cout << "find" << endl;
else
cout << "Not find" << endl;
system("pause");
return 0;
}
輸出結果: