網(wǎng)站建設(shè)到運(yùn)營(yíng)需要多少錢怎樣在百度上做廣告
迭代器是一種檢查容器內(nèi)元素并且遍歷容器內(nèi)元素的數(shù)據(jù)類型。它提供對(duì)一個(gè)容器中的對(duì)象的訪問(wèn)方法,并且定義了容器中對(duì)象的范圍。
一、vector容器的iterator類型
vector容器的迭代器屬于隨機(jī)訪問(wèn)迭代器,一次可以移動(dòng)多個(gè)位置。
vector<int>::iterator iter;//變量名為iter
成員函數(shù) | 功能 |
begin() | 返回指向容器中第一個(gè)元素的正向迭代器,若是const類型容器,在該函數(shù)返回的是常量正向迭代器。 |
end() | 返回指向容器最后一個(gè)元素之后一個(gè)位置的正向迭代器;如果是const類型容器,在該函數(shù)返回的是常量正向迭代器。此函數(shù)通常和begin()搭配使用。 |
rbegin() | 返回指向最后一個(gè)元素的反向迭代器;如果是const類型,在該函數(shù)返回的是常量反向迭代器。 |
rend | 返回指向容器第一個(gè)元素之后一個(gè)位置的反向迭代器;如果是const類型容器,在該函數(shù)返回的是常量正向迭代器。此函數(shù)通常和rbegin()搭配使用。 |
cbegin() | 和begin()功能類似,其返回的迭代器類型為常量正向迭代器,不能修改元素。 |
cend | 和end()功能類似,其返回的迭代器類型為常量正向迭代器,不能修改元素。 |
crbegin() | 和rbegin()功能類似,其返回的迭代器類型為常量反向迭代器,不能修改元素。。 |
crend | 和rend()功能類似,其返回的迭代器類型為常量反向迭代器,不能修改元素 |
#include<iostream>
#include<vector>
using namespace std;
int main()
{int arr[]={0,1,2,3,4};vector<int> vecInt;vecInt.assign(arr,arr+5);vector<int>::iterator t;vector<int>::reverse_iterator t1;
//1、 t=vecInt.begin();for(;t<vecInt.end();t++){cout<<*t<<" ";} cout<<endl;
// 輸出:0,1,2,3,4 //2、 t=vecInt.end();t--; for(;t>=vecInt.begin();t--){cout<<*t<<" ";} cout<<endl;
// 輸出:4,3,2,1,0 //3、t1=vecInt.rbegin();for(;t1<vecInt.rend();t1++){cout<<*t1<<" ";} cout<<endl;
// 輸出:4,3,2,1,0 //4、 t1=vecInt.rend();t1--;for(;t1>=vecInt.rbegin();t1--){cout<<*t1<<" ";} cout<<endl;
// 輸出:0, 1, 2, 3, 4return 0;
}
二、迭代器失效
插入元素后導(dǎo)致失效
#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> vecInt1;vecInt1.push_back(0);vecInt1.push_back(1);vecInt1.push_back(2);vecInt1.push_back(3);vecInt1.push_back(4);vector<int>::iterator t;t=vecInt1.begin()+2;vecInt1.insert(t,5);cout<<*t<<endl;
// 本來(lái)應(yīng)該指向2,插入后指向5 return 0;
}
序列使容器刪除元素失效
錯(cuò)誤示范:
#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> vecInt1;vecInt1.push_back(0);vecInt1.push_back(1);vecInt1.push_back(1);vecInt1.push_back(1);vecInt1.push_back(4);vector<int>::iterator t;t=vecInt1.begin();for(;t<vecInt1.end();t++){if(*t==1){vecInt1.erase(t);} } t=vecInt1.begin();for(;t<vecInt1.end();t++){cout<<*t<<" ";} cout<<endl;// 輸出為0,1,4,沒(méi)有刪除干凈1 return 0;
}
由于刪除后下一個(gè)元素會(huì)移到被刪除的元素,如果此時(shí)指針仍自加1,導(dǎo)致該元素被忽略
解決辦法:
#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> vecInt1;vecInt1.push_back(0);vecInt1.push_back(1);vecInt1.push_back(1);vecInt1.push_back(1);vecInt1.push_back(4);vector<int>::iterator t;t=vecInt1.begin();for(;t<vecInt1.end();){if(*t==1){vecInt1.erase(t);} else{t++;} } t=vecInt1.begin();for(;t<vecInt1.end();t++){cout<<*t<<" ";} cout<<endl;// 輸出為0,4return 0;
}