Set,Multiset,Iterator(迭代器)详解
Set,Multiset,Iterator(迭代器)
Iterator:迭代器
我们可以发现所谓一些数据结构比如说数组和链表,它们都有一些相似的性质。我们看下面两个例子:
- 数组:定义数组\(int~a[10]\),第一个元素的指针为\(a\),第二个元素的指针为\(a+1\),第三个元素的指针为\(a+2\),等等、
- 链表:对于一个链表\(list\text{<}int\text{>}~mylist;\),它的储存方式是链式储存,内存里的地址不是连续的,而是分散的,它只能用\(next\)或者\(last\)来访问元素。
为了统一这两种储存方式的指针,我们引入了一种更加高级的指针,叫做\(iterator\),现在定义一个\(iterator\):\(std\text{::}set\text{<}int\text{>::}iterator~iter\),这种指针可以支持以下的操作:
- \(iter\text{++}\) :将\(iter\)指向下一个元素的地址
- \(iter-\hspace{0.2pt}-\) :将\(iter\)指向上一个元素的地址
- \(*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,2,3,4,5,6,8,9\}\)
\(*lower\_bound(7) = *upper\_bound(7) = 8\)
-
对于数组\(\{1,2,3,3,3,3,3,4\}\)
\(*upper\_bound(3) - *lower\_bound(3) = count(3) = 5\)
-
对于集合\(\{1,2,3,4,5,6,7,8,9\}\)
\(lower\_bound(10) = upper\_bound(10) = set.end()\)