3.4迭代器简介
迭代器是一种检查容器内元素并遍历元素的数据类型。
每种容器都定义了自己的迭代器类型,如:
vector<int>::iteror iter; //定义了一个名为iter的变量,他的数据类型是有vector<int>定义//的iterator类型。
begin和end操作
由begin返回的迭代器指向第一个元素
vector<int>::itertor iter=ivec.begin( ); //iter即为ivec的第一个元素ivec[0]
由end返回的迭代器指向末端元素的下一个,通常称为“超出末端迭代器”。
//用迭代器将vector<int>中的元素全部置零
vector<int> vec(10,1);
for(vector<int>::iterator iter=vec.begin();iter!=vec.end();++iter){
*iter=0;
}
const_iterator类型,只可以读取容器内元素,不可以改变之!
对const_iterator类型解引用,只能得到一个指向const对象的引用。
//只有读操作时,使用const_iterator类型
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(){
vector<int> vec(10,1);
for(vector<int>::const_iterator iter=vec.begin();iter!=vec.end();++iter){
cout<<*iter;
}
return 0;
}
习题3.17
//重做3.13,使用迭代器而不是下标
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> ivec;
int ival;
cout<<"input numbers(ctrl+z to end):"<<endl;
while(cin>>ival)
ivec.push_back(ival);
if(ivec.size()==0){
cout<<"no elements!"<<endl;
return -1;
}
cout<<"sume of each pair of adjacent elements in the vector:"<<endl;
vector<int>::size_type cnt=0;
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();iter=iter+2){
cout<<*iter+*(iter+1)<<" ";
cnt++;
if(cnt%6==0)
cout<<endl;
}
if(ivec.size()%2!=0)
cout<<"The last element is not been summed"
<<",the value is "<<*(ivec.end()-1)<<endl;
return 0;
}
//重做3.14
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(){
vector<string> vec;
string val;
while(cin>>val)
vec.push_back(val);
if(vec.empty()){
cout<<"no data!"<<endl;
return -1;
}
vector<int>::size_type cnt=0;
for(vector<string>::iterator iter=vec.begin();iter!=vec.end();iter++){
for(vector<string>::size_type index=0;index!=(*iter).size();index++)
(*iter)[index]=toupper((*iter)[index]);
cnt++;
cout<<*iter<<" ";
if(cnt%8==0)
cout<<endl;
}
return 0;
}
习题3.18
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(){
vector<int> ivec;
cout<<"请输去10个数,程序使之变为原来的两倍:"<<endl;
int val;
while(cin>>val)
ivec.push_back(val);
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();iter++){
*iter=(*iter)*2;
cout<<*iter<<" ";
}
return 0;
}
习题3.20
以上几个题目使用了vector<int>::iterator和vector<string>::iterator两种迭代器。
为了访问元素类型为int和string的vector元素
注意:任何改变vector长度的操作都会使已存在的iter失效!!push_back之后,就不能再信赖指向vector的迭代器的值了!!