Set,Multiset,Iterator(迭代器)详解

Set,Multiset,Iterator(迭代器)


Iterator:迭代器

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

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

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

  1. \(iter\text{++}\) :将\(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()\)

posted @ 2019-07-19 00:52  gyro永不抽风  阅读(1222)  评论(0编辑  收藏  举报