STL associative containers(关联容器)

来源:互联网 发布:mac一般用什么办公软件 编辑:程序博客网 时间:2024/06/01 10:32

关联式容器通常是用二叉树(binary Tree)实现的。 关联式容器的最大的特点就是it is always sorted(即容器内的元素总是排好序的(默认的是<))。 当我们向这个二叉树插入一个值的时候, 会插入到合适位置处。  当我们删除一个元素的时候, 容器内的所有元素依然是in oder的。  由于我们的关联容器是排好序的。 那么这就导致了像push_back, push_front等函数就不再make sense 了。

 

 

例如下面的例子, 对于集合:

(1)插入很快, 到达O(logn), 不论插入的位置在哪里

(2)查找的也很快, 达到O(logn)

(3)insert函数返回的是一个pair类。 其中second为bool类型, 告诉我们插入操作是否成功

例如下面的第二个myset.insert(3)语句, 由于集合中已经有3了, 而且集合不允许duplicate element, 所以插入不会成功。 pair的first的类型是一个迭代器, 如果插入成功, 该迭代器指向插入的位置, 如果失败, 则指向已经存在的元素的位置处。

(3)insert(it, 9)的含义是将9 插入到it指向的元素之前。 这是错误的。 因为插入的元素应该插入到那个位置并不是由你决定的。 只能有这个被插入元素的值所决定。  但是这个操作也是有好处的, 可能会降低时间复杂度

 

 

对于multiset, 和set相似, 区别是允许duplicated items。 所以想一个multiset插入一个元素总是成功的。 关于set和multiset的一个重要的点就是: 我们不同修改者两个容器中的值。 这些元素市只读的。 因为如果你修改了, 那么我们的容器就可能会违背容器元素已经排好序的这个规则。

 

 

有的时候, 人们希望我们的关联式容器不是根据某个值而排序的, 而是根据某个key 排序。 此时显然set 或者multiset不再满足需要了。 这就是为什么我们有map 和 multimap 的原因:

 

map和multimap具有key 和 value的值。 map 不允许出现相同的key值。 但是multimap 允许出现两个或者多个想相同的key。

 

 

首先, 当我们想要向map中插入元素的时候, 我们需要创建一个pair类的对象, from char to int。 我们也可以使用make_pair 函数, 返回给我们一个pair。

insert 函数也可以吃另外一个迭代器作为参数, 用于表示要插入的位置。 find 函数根据所给的键值查找到这个元素。 返回的是一个指向这个元素的迭代器。查找的速度很快, 达到对数时间。

也可以存取一个pair(由于有两个数据元素), 如上所示。

 

对于multimap而言, 运行重复的键。

 

关于map 和multimap的一个重要的知识就是, 容器内的键不能被修改。 map和multimap 是由一些pair类的对象组成的。

最后说说“associative”的意思?

之所以交Associative 容器, 实际上式来源于map。 即value is associated with key。 对于set和multiset, 我们可以将其想象成为map和multimap, 也就是说此时key 和value 是相同的。

0 0
原创粉丝点击