学完了顺序容器和关联容器之后呢,大概知道了顺序容器是容器内部的元素是按照顺序存储的,而关联容器是按照键值对来存储的。顺序容器可以通过下标的位置来访问相应的元素,而关联容器map是通过小标(键)来访问相应的值。最主要的是:其实这些容器都是模板类型的。
当然我觉得最重要的差异还是关联容器当中的元素的数据类型:pair类型的数据,即pair<T1,T2>p1;make_pair(v1,v2);
下面详细的来看一下顺序容器和关联容器在操作上的差异:
1.首先不管是顺序容器还是关联容器都是要定义的,由于容器的类型不同,存在一些差异:(这里主要将常见的定义)
顺序容器的定义:1. C<T>c ; 2. C c(n,t) ; 3.C c(b,e) ; 4.C c(c2) ;
关联容器的定义:1.map<k,v>m; 2.map<k,v>m(m2);3.map<k,v>m(b,e);
2.建立了容器之后,当然是要往里面添加元素的操作了
在顺序容器中,添加元素的操作主要有:1.m.push_back()(这个操作适合所有的顺序容器)2.m.push_front()(适合于list和deque容器)3.m.insert(p,t)(p是迭代器)4.m.insert(p,n,t);5.insert(p,b,e);
在关联容器中,添加元素的操作主要有:1.通过下标来添加,关联容器通过下标(即键)来访问和添加元素,当下标不在容器中就添加相应的键值对,如果存在,则返回键对应的值(只针对map容器)2.采用insert()操作:m.insert(e)(e是value_type类型的值),m.insert(beg,end) ,m.insert(iter,e),同样当容器中存在相应的元素时,insert则不作任何的操作,如果容器中没有相应的元素则插入相应的元素,返回插入元素相应的位置。
3.容器的大小,迭代器的操作两种类型的容器基本上是相同的:基本上容器大小是:m.size(),迭代器:C<T>::iterator iter。
4.有了元素之后,当然是想删除不必要的元素的操作:
在顺序容器中:删除元素有:c.erase(p)(p是迭代器) ;c.erase(b,e) ; c.clear() ; c.pop_back()(删除容器最后一个元素); c.pop_front() (删除容器第一个元素,只适合于list和deque)
在关联容器中,删除元素:e.erase(k)(k是键)返回size_type类型的值,表示删除元素的个数。e.erase(p)(p是迭代器);m.erase(b,e)
5.接下来当然是遍历容器当中的所有元素的操作咯。
在顺序容器中,由于元素时按照顺序存储的,所以可以通过迭代器和下标法两种方式来遍历容器中的所有元素:
for(C<T>::iterator iter=c.begin();iter!=c.end();++iter) for(C<T>::reverse_iterator iter=c.rbegin();iter!=c.rend();++iter)((迭代器法)for(c<T>::size_type ix=0;ix!=c.size();++ix)(下标法)
在关联容器中,由于元素是按照键值对的方式存储的。所以它是通过迭代器的方式来遍历所有的元素:
for(m<k,v>::iterator iter=m.begin();iter!=m.end();++iter) for(m<k,v>::reverse_iterator iter=c.rbegin();iter!=c.rend();++iter)
6.访问容器中某一特定的元素:
在顺序容器中,访问特定的元素可以直接通过下标法即vec[n]来访问相应的元素。
在关联容器中,访问特定的元素就是相当于查找某一个元素,则可以通过m.find()和m.count()两个函数来实现,首先通过find成员函数找到元素的位置,然后通过count函数统计元素出现的次数,一次来得到相应的元素。
7.在multimap和multiset容器中查找相应的元素是通过m.lower_bound(k),m.upper_bound(k),m.equal_range(k)的方式来查找相应的元素的。