码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-03-29 17:59:44      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

顺序容器和关联容器的特点
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 &val)
  iterator insert(iterator position, size_type n, value_type &val)
  iterator insert(iterator position, iterator first, iterator last)
  关联容器map和set的insert函数的三种形式为:
  iterator insert(iterator position, value_type &val)
  pair<iterator, bool> insert(value_type &val)
  void insert(iterator first, iterator last)
  关联容器multimap和multiset的insert函数的三种形式为:
  iterator insert(iterator position, value_type &val)
  iterator insert(value_type &val)
  void insert(iterator first, iterator last)
  可以看到关联容器的insert函数的三种形式中,保留了与顺序容器一样的iterator insert(iterator position, value_type &val)这样的形式(保留这种形式的目的可能是为了提高插入效率),但是由于关联容器会自动排序,因此后面两种形式都没有指定插入位置,即iterator,但就关联容器而言: 
  2.1)对于map和set而言,由于不允许重复元素,因此第二种形式返回值为pair<iterator, bool>,判断元素是否重复
  2.2)对于multimap和multiset而言,由于允许重复元素,因此第二种形式返回值为iterator,不用判断元素是否重复
5.顺序容器的erase函数的形式为:
  iterator erase(iterator positioin)
  iterator erase(iterator first, iterator last)
  关联容器的erase函数的形式为:
  iterator erase(iterator position)
  iterator erase(iterator first, iterator last)
  iterator erase(key_type &val)
6.对于插入和删除一定范围内的元素,范围是[first,last)
7.begin()指的是第一个元素,end()指的是最后一个元素的下一位;rbegin()指的是最后一个元素,rend()指的是第一个元素的前一位
8.对于元素的查找,顺序容器的函数是返回指定位置的元素,即reference at(size_type n)
  对于元素的查找,关联容器的函数是返回指定键的迭代器,即iterator find(key_type &val)
  注:list没有at()函数,因为list关心的是的插入和删除这种动态操作,如果需要at的话,可以使用vector,而vector关心的是对自身元素的顺序访问或随机访问 
9.关联容器有几个相关联的函数,它们是equal_range()、lower_bound()、upper_bound()、key_comp()、value_comp(),之所以说这几个函数是相关联的,是因为equal_range()返回的是两个迭代器是根据lower_bound()和upper_bound()得到的,而lower_bound()和upper_bound()则依据的是key_comp() 
10.list有几个有意思的函数,它们是sort()、remove_if()、unique()。sort()可以默认排序(根据字母表排序,大写排在小写前)或者指定排序函数进行排序; unique()可以删除相同元素或者根据指定比较函数删除元素;remove_if()可以根据指定函数删除元素 
  注:sort()、remove_if()、unique()中指定的规则可以是函数或者类/结构体对象,如果是类/结构体对象,则该类/结构体需要重载operator()

 


STL各容器粗略对比

  转载:http://blog.csdn.net/dinghqalex/article/details/44194783
1.vector
  变长一维数组,连续存放的内存块,有保留内存,堆中分配内存;
  支持[]操作,高效率的随机访问;
  在最后增加元素时,一般不需要分配内存空间(因为有保留内存),速度快;在中间或开始操作元素时要进行内存拷贝,效率低;
  vector高效的原因在于配置了比其所容纳的元素更多的内存(即有保留内存),内存重新配置会花很多时间;
  注:需要高效的随机存取而不在乎插入和删除,使用vector
2.list
  双向链表,内存空间上可能是不连续的,无保留内存,堆中分配内存;
  不支持随机存取,开始和结尾元素的访问时间快,其他元素都为O(n)
  在任何位置安插和删除元素速度都比较快,插入和删除操作不会使其他元素的各个pointer、reference、iterator失效
  注:大量的插入和删除而不关心随机存取,使用list
3.deque
  双端队列,在堆上分配内存,一个堆保存几个元素,堆之间使用指针连接;
  支持[]操作,在首尾插入和删除元素较快,在中部插入和删除则较慢,像是vector和list的结合
  注:关心插入和删除且关心随机存取,折中使用deque
4.map&multimap
  字典库,一个值映射成另一个值,使用平衡二叉树存储,按照给定的排序规则对key值进行排序;
  map中的key值不允许重复,multimap中的key值允许重复;
  根据已知key值查找元素较快;
5.set&multiset
  有序集合,使用平衡二叉树存储,按照给定的排序规则对set中的数据进行排序;
  set中不允许重复元素,multiset中允许重复元素;
  查找元素速度较快;

 

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

标签:

原文地址:http://www.cnblogs.com/kevinq/p/4375877.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!