• C++ 迭代器(iterator)


    迭代器介绍

    迭代器(iterator):容器类型内置的“指针”
    - 使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另一个元素。
    - 有迭代器的类型都拥有 begin 和 end 成员
    	- begin:返回指向第一个元素(或字符)的迭代器
    	- end:尾后迭代器,即尾元素的下一个位置(一个本不存在的元素) 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用迭代器

    auto b = v.begin(),e = v.end(); // b和e的类型相同
    
    • 1

    如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器

    在这里插入图片描述
    举个例子,下面利用迭代器实现

    string s = "some string";
    if(s.begin() != s.end()) { //确保s非空
    	auto it = s.begin();  //it表示s的第一个字符
    	*it = toupper(*it);   //将当前字符改成大写形式
    }  //Some string
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用迭代器遍历容器

    for(auto it = s.begin(); it != s.end() && !isspace(*it); ++it) {
        *it = toupper(*it);
    }  // SOME string
    
    • 1
    • 2
    • 3
    • 迭代器类型
    vector<int>::iterator it;     //it能读写元素
    vector<int>::const_iterator it2;//it2只能读元素,不可以写元素
    
    • 1
    • 2

    如果vector或者string对象是一个常量,只能使用const_iterator;如果不是常量,则既能使用iterator也能使用const_iterator

    • 正序迭代
    begin();end()   //iterator
    cbegin();cend()  //const_iterator
    
    • 1
    • 2
    • 逆序迭代
    rbegin();rend()  //reverse_iterator
    
    • 1
    int main() {
        vector<int> vec{0,1,2,3,4,5,6,7,8,9};
    
        vector<int>::reverse_iterator it;
        for (it = vec.rbegin();         // 迭代器指向最后一个元素
             it != vec.rend();          // rend() 指向第一个元素的前一个
             ++it)					    // ++操作访问前一个元素
            cout << *it<< " ";    // prints 9,8,7,...0
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    迭代器解引用

    vector<string> vec;
    auto it = vec.begin();
    (*it).empty()  //检查vector中的元素是否为空,只需检查it所指字符串是否为空
    
    • 1
    • 2
    • 3
    • 箭头运算符(->)
    it->mem & (*it).mem  表达的意思相同
    
    • 1

    WARNING

    任何一种可能改变vector对象容量的操作,比如push_back,都会使该vector对象的迭代器失效。
    但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。

    迭代器运算

    在这里插入图片描述
    或者是两个迭代器相减,就可以得到中间隔了多少个元素。

    使用迭代器运算的一个经典算法是二分搜索:

    vector<int> text = {1,2,3,4,5};
        auto sought = 2;
        auto beg = text.begin(), end = text.end();
        auto mid = beg + (end - beg) / 2;   //初始状态的中间点
        
        while(mid != end && *mid != sought) {
            if(sought < *mid) end = mid;
            else beg = mid + 1;
            mid = beg + (end - beg) / 2;   //新的中间点
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    循环过程终止时,mid或者等于end或者指向要找的元素。如果说mid等于end,说说明text中没有我们要找的元素。

  • 相关阅读:
    2013年11月10日 Go生态洞察:Go语言四周年回顾
    logback.xml配置详解
    python+vue精品课程在线学习系统
    华为云CodeArts Check代码检查服务用户声音反馈集锦(1)
    2014软专 P117
    江门車馬炮汽车金融中心 11月11日开张
    周记-20220626
    【每日一题Day33】LC799香槟塔 | 动态规划
    如何利用基于充血模型的DDD开发一个虚拟钱包系统?
    史上最全的Python包管理工具:Anaconda教程
  • 原文地址:https://blog.csdn.net/weixin_45774972/article/details/133351408