C++ STL 容器

来源:互联网 发布:java的发展趋势 编辑:程序博客网 时间:2024/05/15 03:31

一、关联容器:

    关联容器与顺序容器的本质区别是,不是通过index(offset),而是通过key来存取value的。

    C++关联容器包括map,multimap,set,multiset四种,他们的内部实现数据结构都是红黑树(红黑树具体原理参见数据结构篇之红黑树)。其中map和set要求同一个key只能对应一个value,不能有同一个key对应着不同的value,而multimap和multiset可以使相同的key对应不同的value。

    关联容器共享顺序容器的大部分操作,除了:front,push_front,pop_front,back,push_back,pop_back,即不支持与位置相关的操作。


1. pair:

    1.1. STL pair的实现原理

        定义了两个成员变量的结构体,重载了一些操作符,例如“==”,“<”。    


2. map:

    1.1. 注意事项:

    (1)实际工作中需要注意键类型要重载"<"操作符。

    (2)map可以有自己的迭代器,用来遍历map,map iterator的类型是bidirectional iterator。

    (3)map key所存放的对象必须有“<”操作符,例如list的iterator由于没有"<"操作符,所以不能用作map的key。

    (4)map key为const类型,不能进行写操作。

    (5)map按照key顺序排列。


    1.2. 操作:

    (1)map添加对象包括两种方式:

    方式一(下标):map[keyName] = valueName


    与顺序容器下标访问的区别是:

    a)用下标访问一个不存在的key,会创建一个新的key-value对,value初始化为0或者构造函数创建的值。

    因为下标访问分为两步:

    首先判断key不存在,创建key-value,value初始化;

    然后再给value进行赋值操作。


    b) map使用iterator解引用和下标访问获得的对象类型不同,前者是pair对,后者是mapped_type也就是value的类型。


    方式二(insert函数):

    insert函数插入pair类型的数据,返回值仍然是一个pair类型的数据,pair中存放的是迭代器和一个bool值,其中迭代器指向map中插入的元素,bool值表示是否插入成功。


3. set:

    set仅仅是key的集合,应用场景为仅仅需要判断一个value存在不存在,而不需要对value本身进行存取。

    set不支持下标操作符。

    set存储的key必须是唯一的,且不能修改。

    set按照key顺序排列。


4. multimap和multiset:

    multimap和multiset允许每个key对应多个实例。

    multimap不支持下标运算。


5. 附上文本查询程序,用户从指定的文件查询单词,统计该单词出现的总次数以及列出该单词出现的行,如果单词在同一行中出现多次,只列出该行一次,代码如下:


0 0