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())

原文地址:https://www.cnblogs.com/jeffersonqin/p/11210915.html