Ch5 关联式容器(中)

5.3 set

  1. 所有元素都会根据元素的键值自动被排序,set元素的键值就是实际值,实际值就是键值,set不允许两个元素有相同的键值;
  2. 因为set元素的值就是其键值,关系到set元素的排列规则,所以set的迭代器是constant iterator;
  3. 对set进行insert或erase操作,其迭代器在操作后仍然有效(这点和list相同);
  4. 标准STL的set是以RB-tree为底层机制的,几乎所有的set操作行为,都只是调用RB-tree的操作行为而已。

5.4 map

  1. 所有元素都会根据元素的键值自动被排序;
  2. map的所有元素都是pair,同时拥有实际值(value)和键值(key),pair的第一元素被视为键值,第二元素被视为实际值;
  3. map不允许两个元素拥有相同的键值;

    //<stl_pair.h>
    template <class T1, class T2>
    struct pair{
        typedef T1 first_type;
        typedef T2 second_type;
    
        T1 first;
        T2 second;
    
        pair() : first(T1(), second(T2()) { }
        pair(const T1& a, const T2& b) : first(a), second(b) { }
    };
  4. 同样地,map的迭代器不允许改变map的元素内容(键值不可以,但实际值可以);
  5. 标准STL的map是以RB-tree为底层机制的,几乎所有的map操作行为,都只是调用RB-tree的操作行为而已。

5.5 multiset

multiset的特性及用法和set完全相同,唯一的差别在于它允许键值重复,因此它的插入操作采用的是底层机制RB-tree的insert_equal()而非insert_unique()。

5.6 multimap

multimap的特性及用法和map完全相同,唯一的差别在于它允许键值重复,因此它的插入操作采用的是底层机制RB-tree的insert_equal()而非insert_unique()。

时间: 2024-07-31 14:26:34

Ch5 关联式容器(中)的相关文章

Ch5 关联式容器(下)

5.7 hushtable 5.7.1 hushtable概述 开链:在每一个表格元素中维护一个list:hash function为我们分配某一个list,然后我们在那个list身上执行元素的插入.搜寻.删除等操作. 5.7.3 hashtable的迭代器 template <class Value, class Key, class HashFcn, class ExtractKey, class EqualKey, class Alloc> struct __hushtable_iter

关联式容器(associative containers)

根据数据在容器中的排列特性,容器可分为序列式(sequence)和关联式(associative)两种. 标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及两大类的衍生体multiset(多键集合)和multimap(多键映射表).这些容器的底层机制均是以RB-tree(红黑树)完成.RB-tree也是一个独立的容器,但并不开放给外界使用. 此外,SGI STL还提供一个不在规格标准之列的关联式容器:hash table(散列表),以及以此hash table为底层机制而完成

关联式容器的总结

今天细致的学习了map和set容器的用法和功能,终于感受到了自己之前对stl的认识还是太少太浅薄了 今天我来总结一下答题的框架 容器首先分为关联式容器和序列式容器, 简单的是序列式容器,我先说一下序列式容器,序列式容器其实说白了就是简单的链表的实现,内部查找的顺序都是按照链表的顺序结构来查找删除和实现的, 下面说的就是关联式容器{ 再说关联式容器之前我先介绍几个知识点: 1二叉搜索树,二叉搜索树可以分为两中,一种是平衡二叉树,另一种是非平衡二叉树,平衡二叉树的实现其实就是我们所说的关联式容器的实

《STL源码剖析》学习笔记-第5章 关联式容器(二)

1.set和multiset set的特性: (1)所有元素都会根据元素的键值自动被排序. (2)set是集合,它的元素的键值就是实值,实值就是键值,不允许两个元素有相同的值. (3)不可以通过set的iterator来改变元素的值,因为set的元素值就是键值,改变键值会违反元素排列的规则. (4)在客户端对set进行插入或删除操作后,之前的迭代器依然有效.当然,被删除的元素的迭代器是个例外. (5)它的底层机制是RB-tree.几乎所有的操作都只是转调用RB-tree的操作行为而已. mult

C++ 容器:顺序性容器、关联式容器和容器适配器

什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种"对象"还包含了一系列处理"其它对象"的方法,因为这些方法在程序的设计上会经常被用到,所以容器也体现了一个好处,就是"容器类是一种对特定代码重用问题的良好的解决方案". 容器还有另一个特点是容器可以自行扩展.在解决问题时

《STL源码剖析》读书笔记之关联式容器(1)

1.AVL树 AVL tree是指任何节点的左右子树高度相差最多1的二叉搜索树.任何节点左右子树高度最多相差1能够保证AVL树具有"对数深度"的平衡状态.在对AVL tree进行插入操作时,可能造成树平衡被破坏.根据新结点插入位置的不同,可以将平衡的破坏分成四种情况:左左,左右,右左,右右.其中左左和右右被称为外侧插入,可以采用单旋转操作调制解决.而左右和右左则称为内侧插入,可以采用双旋转操作调整解决. 单旋转: 双旋转: 2.RB-tree RB-tree是另外一个被广泛应用的平衡二

《STL源码剖析》读书笔记之关联式容器(2)

1.hashtable 二叉搜索树具有对数平均时间的表现,但这样的表现构造在一个假设上:输入数据有足够的随机性.而hashtable在插入.删除.搜寻等操作上也具有"常数平均时间的表现",而且这种表现是以统计为基础的,不依赖于输入的随机性. 一个简单的hashtable的例子: 如果元素是32bits而不是16bits,我们要准备的array就必须是4GB的.这就大的不切实际了.如何避免一个大的荒谬的数组呢?办法之一就是使用某种映射函数,将大数映射为小数.负责将某以元素映射为一个&qu

《STL源码剖析》学习笔记系列之五——关联式容器(2)

Hashtable 2.1 简介    哈希表,又名散列表,可以提供"常数时间"的插入.删除.查询等操作.不同的元素通过hash function映射到不同的位置,但当不同元素获得经hash function获得相同的位置(索引)时,则发生"碰撞",此时需要通过以下几种方法为新加入的元素寻找新的索引地址. 1.        线性探测法 由于为元素准备的为一块连续内存空间地址,该方法会循序往下一一寻找,若达到所分配地址尾端,则环绕到头部继续寻找.所找到的第一个空闲地

spring在IoC容器中装配Bean详解

1.Spring配置概述 1.1.概述 Spring容器从xml配置.java注解.spring注解中读取bean配置信息,形成bean定义注册表: 根据bean定义注册表实例化bean: 将bean实例放入bean缓存池: 应用程序使用bean. 1.2.基于xml的配置 (1)xml文件概述 xmlns------默认命名空间 xmlns:xsi-------标准命名空间,用于指定自定义命名空间的schema文件 xmlns:xxx="aaaaa"-------自定义命名空间,xx