zoukankan      html  css  js  c++  java
  • Set,Multiset,Iterator(迭代器)详解

    Set,Multiset,Iterator(迭代器)


    Iterator:迭代器

    我们可以发现所谓一些数据结构比如说数组和链表,它们都有一些相似的性质。我们看下面两个例子:

    1. 数组:定义数组(int~a[10]),第一个元素的指针为(a),第二个元素的指针为(a+1),第三个元素的指针为(a+2),等等、
    2. 链表:对于一个链表(list ext{<}int ext{>}~mylist;),它的储存方式是链式储存,内存里的地址不是连续的,而是分散的,它只能用(next)或者(last)来访问元素。

    为了统一这两种储存方式的指针,我们引入了一种更加高级的指针,叫做(iterator),现在定义一个(iterator)(std ext{::}set ext{<}int ext{>::}iterator~iter),这种指针可以支持以下的操作:

    1. (iter ext{++}) :将(iter)指向下一个元素的地址
    2. (iter-hspace{0.2pt}-) :将(iter)指向上一个元素的地址
    3. (*iter):获得(iter)指针所指向地址所储存的值

    Set / Multiset

    (Set)是指集合,它有集合所拥有的性质:元素的唯一性。而(Multiset)则没有前面所说的性质,会存在形如:({0,0,1,1,2})这样的集合。

    这两种数据结构是默认会进行升序排列,用的是类似于平衡二叉搜索树。

    以下是一种使用(iterator)的例子:

    #include <iostream>
    #include <set>
    #include <algorithm>
    
    int main() {
        std::set<int> s;
        s.insert(2); s.insert(1); s.insert(10);
        std::set<int>::iterator iter = s.end();
        iter --;
        std::cout << *iter << std::endl; // 10
        iter --;
        std::cout << *iter << std::endl; // 2
        iter --;
        std::cout << *iter << std::endl; // 1
    }
    

    通过上面的例子,不难发现,(end())指向的是不存在于(set)的一个地址,是最后一个元素后的一个地址。

    注:

    几乎所有(set)的函数和返回值返回的都是(iterator)

    所有的(lower\_bound())(upper\_bound())都是遵循左闭右开,即([a,b))的形式

    举例:

    1. 对于集合({1,2,3,4,5,6,8,9})

      (*lower\_bound(7) = *upper\_bound(7) = 8)

    2. 对于数组({1,2,3,3,3,3,3,4})

      (*upper\_bound(3) - *lower\_bound(3) = count(3) = 5)

    3. 对于集合({1,2,3,4,5,6,7,8,9})

      (lower\_bound(10) = upper\_bound(10) = set.end())

  • 相关阅读:
    nodejs实战的github地址,喜欢的你还等啥
    java初始化深度剖析
    第三篇之消息的收发
    第二篇之收发消息的封装
    微信公众号开发第一篇之基本开发环境的搭建
    微信开发调试工具
    微信公众号开发入门教程第一篇
    linux常见驱动修改
    微信硬件开发步骤
    Linux系统快速启动方案
  • 原文地址:https://www.cnblogs.com/jeffersonqin/p/11210915.html
Copyright © 2011-2022 走看看