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