• C++ 初读迭代器


    迭代器

    这是个啥?

    string对象或vector对象可以通过下标访问每一个元素,迭代器也具有同样的效果。那又有什么不同呢?事实上并不是所有的容器到可以使用下标访问每一个元素,即在容器上迭代器更具普适性。string类支持迭代器,同vector一样。

    Use

    有的迭代器类型是有返回值的,可是事实上我们不用管它。使用auto就可以愉快地迭代。

    auto a = v.begin();
    auto e = v.end();
    
    //只读不写
    auto a = v.cbegin();
    auto e = v.cend();
    

    值得注意的是,end是指向容器“尾元素的下一个元素”,称为尾后迭代器,简称尾迭代器。

    标准迭代器运算符

    它类似于指针,但不会使用取地址符。

    运算符 含义
    *iter return &
    iter -> men =(*iter).men,获取men成员
    ++iter 下一个元素
    --iter 上一个元素
    iter1 == iter2 是否指向同一个元素或尾后迭代器
    iter1 != iter2

    注:(*iter).men,称为解引用。

    小试牛刀

    string s("hello world");
    if(s.begin()!=s.end()){		//not null
        auto it = s.begin();
        *it='a';				//change value
    }
    

    来个循环

    for(auto it = s.cbegin();it != s.cend();++it)
    {
        cout<<*it;
    }
    cout<<endl;
    

    注:C++习惯使用"!=",其原因是这种编程风格在标准库中所有容器均有效。所有标准库容器都定义"=="和"!=",而不是"<"。

    迭代器运算

    运算 含义
    iter + n 前移n个位置
    iter - n 后移n个位置
    iter += n 前移n个位置,赋值iter
    iter -= n 后移n个位置,赋值iter
    iter1 - iter2 距离
    < > >= <= 位置关系

    注意:n为unsigned int 或者int,不影响计算。

    auto mi = vi.begin() + vi.size() / 2	//计算中间的迭代器
    

    来个binary_search()

    auto beg = text.begin(),end = text.end();
    auto mid = text.begin() + (end -beg) >> 1;
    while(mid != end && *mid! = target)
    {
        if(target < *mid)
            end = mid;
        else
            beg= mid+1;
        mid = beg + (end - beg)/2;
    }
    
  • 相关阅读:
    ORA-01157:无法标识/锁定数据文件,ORA-01110:表空间丢失错误
    Oracle ORA-01033: ORACLE initialization or shutdown in progress
    mysql delete语句不能用别名
    内存溢出
    中间件-RocketMQ-启动
    rz上传文件乱码
    字节码解读(转~谨用作记录)
    java字节码指令列表(转)
    idea打jar包,提示 jar包中没有主清单属性
    MYSQL 查看最大连接数和修改最大连接数
  • 原文地址:https://www.cnblogs.com/goodswarm/p/10539905.html
Copyright © 2020-2023  润新知