【C++学习之(五)】迭代器iterator

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类型增加了更多的迭代器运算符
  1. iter+n
  2. trer-n
  3. iter+= n
  4. iter-=n
  5. iter1-iter2 运算符右侧向前移动差值个元素得到左侧元素 可正可负
  • 最后end减最后一个元素是1
  • 第一个减end是长度
  • 最后一个减end是-1
  1. “>”“ >=” “< ”“<= ”位置在前则小
二分搜索
  //i必需有序
    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?
  • 没有迭代器相加的定义
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值