STL对比解说——关联容器

STL对比解说——关联容器

1. 概述

  关联容器会根据某种准则自动排序容器中元素。operator<为默认的排序准则,也可以提供自己的排序准则。

  关联容器典型的实现是二叉树(red-black tree),每个元素都有a parent 和 two children。左子树为小值,右子树为大值。

  关联容器的优势是查找更快的(对数复杂度,顺序容器线性复杂度)。

  关联容器的key是常量不能直接更改,因为这样会破坏元素的自动排序。因此所有algorithm中变动性算法都不能用。 

  关联容器包含set, multiset, map, multimap。

  (1) set, multiset

  #include <set>

  namespace std {

    template <typename T,

          typename Compare = less<T>,      //默认使用小于,可以自己提供排序准则

          typename Allocator  = allocator<T> >

    class set;

    template  <typename T,   

          typename Compare = less<T>,

          typename Allocator  = allocator<T> >

    class multiset;

  }

  

  set和multiset的key,value是同样的类型T。since C++11 插入和删除multiset保持相等元素的相对顺序不变。

  不提供直接的元素访问,只能通过迭代器间接访问,元素值是常量。

  要改变set的值必须先删除old value,再插入new value。

  (2) map, multimap

  #include <map>

  namespace std {

  template <typename Key, typename T,

         typename Compare = less<Key>,    //按Key进行排序

           typename Allocator = allocator<pair<const Key, T> > > //allocator作为默认内存模型, value_type:pari<const Key, T>

        class map;

  template <typename Key, typename T,

         typename Compare = less<Key>,

         typename Allocator = allocator<pair<const Key, T> > >

           class multimap;
  }

  注意:Key和value必须是copyable or movalbe

     Key 必须是可根据排序准则比较的

      C++11保证相等元素插入和删除时的相对顺序。

     Key为const,要修改Key必须先移除老的Key,在插入新的Key。

  

2. 初始化

  //提供排序准则, 必须为函数对像,一个类型,不能为函数指针。

  set<int, greater<int> >, map<int, int, greater<int> >, 改为准则greater<int>, 默认less<int>

  //以比较函数作为排序准则,作为等价的定义。如:使用if (!(elem1<elem2 || elem2 < elem1))(比较函数less)作为等价(equivalence)的判断标准,判断是否元素重复

  

  

  //常见初始化方式

  set/map  c;            //创建空容器

  set/map  c(op);          //创建以op为排序准则的空容器

  //copy constructor

  set/map  c(c2); 

  set/map  c = c2;

  //区间初始化

  set/map c(beg, end);      //常见的用另一个容器的iterator

  set/map c(beg, end, op);

  Since C++11:

  //move constructor

  set/map c(rv);

  set/map c = rv;  

  //initlist

  set/map c(initlist);      //最好的初始化方式

  set/map c = initlist;

  

  

  //set/map需要相应的类型

  set<elem>,         map<key, value>              //默认less<>

  set<elem, op>,     map<key, value, op>   //比较函数op

  multiset<elem>,   multimap<key, value>

  multiset<elem, op>, multimap<key, value, op>

  

2. 插入元素

  //赋值

  C=C2;

  c=rv;

  c=initlist;

  c1.swap(c2);

  swap(c1, c2);

  //插入, 只能用insert,顺序容器有assign

  c.insert(val);    //插入一个值的方式,平时常用的

  c.insert(pos, val);

  c.insert(beg, end);  //可以替换copy的方式,速度更好, c.insert(istream_iterator(cin), istream_iterator());

  c.insert(initlist);      //最好的给予初值方式

  

  since C++11

  c.emplace(args...);

  c.emplace_hint(pos, args...);

3. 访问

  通过iterator访问,(c/r/cr)begin(), (c/r/cr)end()。

4. 查找

  c.count(val);

  c.find(val);  

  c.lower_bound(val);  //>=val的第一个值

  c.upper_bound(val);  //>val的第一个值

  c.equal_range(val);  //>=val...>val值的范围,pair类型。

  

  

5. 属性

  //基本的比较==,!=,>都支持。

  //大小

  c.empty();

  c.size();

  //比较准则

  c.key_comp();

  c.value_comp();    //set与key_comp()相同。map为pair<const key, value>的比较

6. 删除元素

  c.erase(val);    //删除所有值,multiset,multimap删除第一个可以find后再erase

  c.erase(pos);

  c.erase(beg, end);

  c.clear();

  

STL对比解说——关联容器

时间: 2024-08-26 13:17:01

STL对比解说——关联容器的相关文章

STL中的set容器的一点总结2

http://blog.csdn.net/sunshinewave/article/details/8068326 1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作.vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入.排序.删除.

【转】 STL中的set容器的一点总结

1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作.vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入.排序.删除.查找等.让用户在STL使用过程中,并不会感到陌生. 关于set,必须说明的是set关联式容器.set作为一个容器也是

STL中的set容器的一点总结(转)

STL中的set容器的一点总结 1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作.vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入.排序.删除.查找等.让用户在STL使用过程中,并不会感到陌生. 关于set,必须说明的是set关

顺序容器和关联容器的特点&amp;STL各容器粗略对比

顺序容器和关联容器的特点1.所有的关联容器都会自动排序,但map和set不允许重复元素,而multimap和multiset允许重复元素 2.关联容器中,map和multimap的key和val是分开的,而set和multiset的key和val是相同的 3.除了vector和deque的迭代器为随机迭代器之外,其余容器的迭代器都是双向迭代器,不能进行++操作 4.顺序容器的insert函数的三种形式为: iterator insert(iterator position, value_type

《STL源码剖析》——第五、六:关联容器与算法

第五章.关联容器  5.0.关联容器 标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表).这些容器的底层机制均以RB-tree(红黑树)完成.RB-tree也是一个独立容器,但并不开放给外界使用. SGISTL还提供了一个不在标准规格之列的关联式容器:hash_table (散列表),以及以此hash_table为底层机制而完成的hash_set(散列集合).hash_map(散列映射表).hash_

STL 笔记(二) 关联容器 map、set、multimap 和 multimap

STL 关联容器简单介绍 关联容器即 key-value 键值对容器,依靠 key 来存储和读取元素. 在 STL 中,有四种关联容器,各自是: map 键值对 key-value 存储,key 不可反复,即一个 key 仅仅能相应一个 value, 相应头文件<map> multimap 键值对 key-value 存储,key 能够反复,即一个 key 能够相应多个 value, 相应头文件<map> set 仅仅有 key, key 不可反复,相应头文件<set>

STL源码剖析---关联容器

标准关联容器分为set和map两大类,包括multiset和multimap,这些容器的底层机制都是RB-tree.标准之外的关联容器有hashtable 以及以此hash table为底层机制而完成的hash_set(散列集合) hash_map(散列映射表) hash_multiset  hash_multimap. 序列和关联容器各自的内部关系是内含的,例如heap内含一个vector,priority_quehe内含一个heap,stack和queue都内含一个deque,set/map

Effective STL --关联容器

高效STL-关联容器 标准关联容器中最重要的就是基于等价而不是相等.比如对于基本的函数库有find函数,但是对于set关联容器也是有find成员函数的.因为标准关联容器保持有序,所以每一个容器必须有一个定义了怎么保持东西有序的比较函数(默认是less).等价是根据这个比较函数定义的,所以标准关联容器的用户只需要为他们要使用的任意容器指定一个比较函数 必须为指针的关联容器指定比较类型 一定要明确对于一个容器来说,容器内的迭代器是存入该容器对象的指针,比如一个关联容器存入指针类型,那么使用这个容器的

STL 笔记(二): 关联容器 map、set、multimap 和 multimap

STL 关联容器简介 关联容器即 key-value 键值对容器,依靠 key 来存储和读取元素.在 STL 中,有四种关联容器,分别是: map 键值对 key-value 存储,key 不可重复,即一个 key 只能对应一个 value, 对应头文件<map> multimap 键值对 key-value 存储,key 可以重复,即一个 key 可以对应多个 value, 对应头文件<map> set 只有 key, key 不可重复,对应头文件<set> mult