标签:
顺序容器和关联容器的特点
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中允许重复元素;
查找元素速度较快;
标签:
原文地址:http://www.cnblogs.com/kevinq/p/4375877.html