• 《c++ primer》3.4 迭代器(iterator)


    1. 迭代器(iterator)可以指向 container(比如string, vector等)的任意一个成员,也可以向前或向后移动若干单位。所有的 library container 都有 iterator,但不一定支持下标操作,如 s[0]。所以用 iterator 来引用 container 内部成员,更具有一般性。

    2. 使用 iterator

    auto b = v.begin(), e = v.end();

    其中 auto 表示 b 的类型自动定义;v.end() 指向 v 的最后一个元素之后的位置,称作 off-the-end iterator;v.begin() 指向 v 的第一个元素,或 off-the-end(如果 v 为空)。

    也可以使用 const iterator,即只能读取指向对象,不能改变其值 v.cbegin(), v.cend();const 的 container 只有 const iterator,而普通的 container 既有 begin()/end() 也有 cbegin()/cend()。

    3. dereference an iterator

    string s("some string");
    if (s.begin() != s.end()) {
        auto it = s.begin();
        *it = toupper(*it); //第一个字母变大写
    }

    (*it) 表示迭代器 it 指向的单位。

    4. 迭代器的操作

    *iter                返回 iter 指向的元素的一个别名
    iter->mem        iter 指向元素的一个成员,也可写作 (*iter).mem
    ++iter                iter 指向 container 的下一个单位,off-the-end itarator 不能被增加或dereference
    --iter                  iter 指向 container 的上一个单位
    iter1 == iter2      指向同一个 container的同一个元素,或是同一个container的off-the-end iterator.
    iter + n        向前移动 n 个元素
    iter - n
    iter += n
    iter -= n
    iter1 - iter 2    返回一个带符号的整数类型 difference_type,即 iter1, iter2 指向的元素之间相差的位置,iter2 加上这个整数就得到 iter1
    >, >=, <, <=

    注意:使用 iterator 时,不可改变 container 的 size,比如 vector 的 push_back 函数,使用时可能破坏它的所有 iterator。

    5. 例子:在有序列表中做 binary search

    auto beg = text.begin(), end = text.end();
    auto mid = text.begin() + (end - beg)/2;
    while ( mid != end && *mid != sought){
        if (sought < *mid)
            end = mid;
        else
            beg = mid +1;
        mid = beg + (end - beg)/2;
    }

    寻找目标一直是 beg 到 end-1 指向的元素,如果 beg = end,mid = beg + (end-beg)/2 = end,说明 text 中不存在 sought。否则将在 (*mid) == sought 时结束寻找。所以运行完这块代码以后,要么 beg = mid = end,要么 (*mid) == sought。

    while 循环运行的次数 k 满足 2^k = n,所以时间复杂度是 log(n)。

  • 相关阅读:
    Hadoop综合大作业
    hive基本操作与应用
    理解MapReduce计算构架
    熟悉HBase基本操作
    Hadoop综合大作业
    hive基本操作与应用
    理解MapReduce计算构架
    熟悉HBase基本操作
    熟悉常用的HDFS操作
    爬虫大作业
  • 原文地址:https://www.cnblogs.com/luyi07/p/12544301.html
Copyright © 2020-2023  润新知