c++提供了很多容器 包括vector 对于容器 能够访问下标的是少数 但是所有的容器都能通过迭代器来访问
迭代器有效范围:指向容器中的元素 或者尾元素的下一位置
string类型不是容器 也可以通过迭代器来访问
- 尾后迭代器:返回尾元素的下一元素
- 如果容器为空,那么begin和end都指向尾后迭代器
向量
vector<int> i{1,2,3,4,5,6,7,8,9};
vector<int>::iterator it;
for(it=i.begin();it!=i.end();it++){
cout<<*it<<endl;
}
字符串
string s="jdfvfb";
if(s.begin()!=s.end()){
auto it=s.begin();
*it=toupper(*it);
}
cout<<s<<endl;
转大写
string s="uvhfrg";
string::iterator it;
for(it=s.begin();it!=s.end()&&!isspace(*it);it++)
*it=toupper(*it);
cout<<s<<endl;
尽量在for里面使用!=这复合c++11规范 ,<很多迭代器都没有规定
iterator和const_iterator
- const类型的对象必须用const_iterator来访问 这个只能访问不能修改
- 非const类型 既可以是const迭代器 又可以是iterator
- c++11定义了cbegin 和cend 无论是否是const对象 返回的都是const iterator
vector和string类型增加了更多的迭代器运算符
- iter+n
- trer-n
- iter+= n
- iter-=n
- iter1-iter2 运算符右侧向前移动差值个元素得到左侧元素 可正可负
- 最后end减最后一个元素是1
- 第一个减end是长度
- 最后一个减end是-1
- “>”“ >=” “< ”“<= ”位置在前则小
二分搜索
vector<int> i{1,2,3,4,5,6,7,8,9};
int sought=9;
vector<int>::iterator itbegin=i.begin();
vector<int>::iterator itend=i.end();
vector<int>::iterator itmid=i.begin()+(itend-itbegin)/2;
while(itmid!=itend&&*itmid!=sought){
if(*itmid>sought)
itend=itmid;
else itbegin=itmid+1;
itmid=itbegin+(itend-itbegin)/2;
}
cout<<*itmid;
- 为什么不用
mid=(beg+end)/2
? - 没有迭代器相加的定义