容器可分为两类:
1.序列式容器:可序群集,每个元素的位置取决于插入时间和地点,STL提供三个定义好的序列式容器:vector,list,deque
2.关联式容器:已序群集,元素的位置取决于元素值,STL提供四个定义好的关联式容器:map,multimap,set,multiset
deque是“double-end-queue”的缩写,在头部和尾部插入和删除元素十分迅速。他提供了 push_front和push_back操作,而vector只提供push_back操作。
关联式容器依据一定的排序准则,自动为元素排序,预设情况以operator <排序,也可以提供自己的比较函式,定义不同的排序准则。(见下面代码)关联式容器由二叉树实现,左子树的结点都比自己小,右结点都比自己大。
自定义排序准则示例:
#include
<
iostream
>
#include
<
set
>
using
namespace
std; template
<
class
T
>
class
RuntimeCmp
...
{ public : enum cmp_mode ... {normal,reverse} ; private : cmp_mode mode; public : RuntimeCmp(cmp_mode m = normal):mode(m) ... {} bool operator ()( const T & t1, const T & t2) const ... { return mode == normal ? t1 < t2:t2 < t1; } bool operator == ( const RuntimeCmp & rc) ... { return mode == rc.mode; } }
; typedef
set
<
int
,RuntimeCmp
<
int
>>
IntSet;
void
fill(IntSet
&
set
);
void
print(IntSet
&
set
);
int
main()
...
{ IntSet coll1; fill(coll1); print(coll1); RuntimeCmp < int > reverse_order(RuntimeCmp < int > ::reverse); IntSet coll2(reverse_order); fill(coll2); print(coll2); coll1 = coll2; coll1.insert( 3 ); print(coll1); if (coll1.value_comp() == coll2.value_comp()) cout << " same sortint " << endl; else cout << " different sorting " << endl; return 0 ; }
void
fill(IntSet
&
set
)
...
{ set .insert( 4 ); set .insert( 7 ); set .insert( 5 ); set .insert( 1 ); set .insert( 6 ); set .insert( 2 ); set .insert( 5 ); }
void
print(IntSet
&
set
)
...
{ IntSet::iterator it = set .begin(); for (it;it != set .end(); ++ it) cout <<* it << " " ; cout << endl; }
C++程序库还提供了一些特别的(并未预先定义好的)容器配接器,包括stack,queue,priority queue
三种迭代器的配接器(iterator adapters):
1.Insert Iterators:可以使演算法以安插方式而不是覆盖方式运作,运用它,可以解决目标空间不足的问题,它会使目标空间的大小按需要成长,下面的例子演示了预先定义好的insert iterators
#include
<
vector
>
#include
<
set
>
#include
<
deque
>
#include
<
list
>
#include
<
algorithm
>
using
namespace
std;
int
main()
...
{ list < int > coll1; for ( int i = 1 ;i < 9 ; ++ i) ... { coll1.push_back(i); } vector< int > coll2; copy(coll1.begin(),coll1.end(),back_inserter(coll2)); deque < int > coll3; copy (coll1.begin(),coll1.end(),front_inserter(coll3)); set < int > coll4; copy(coll1.begin(),coll1.end(),inserter(coll4,coll4.begin())); return 0 ; }
2.Stream Iterators
3.Reverse iterators
函式演算法示例:
#include
<
vector
>
#include
<
iostream
>
#include
<
algorithm
>
using
namespace
std;
void
print(
int
elem)
...
{ cout << elem << " " ; }
int
main()
...
{ vector < int > coll; for ( int i = 1 ;i < 9 ; ++ i) coll.push_back(i); for_each(coll.begin(),coll.end(),print); cout << endl; return 0 ; }
仿函式示例(function object):
#include
<
vector
>
#include
<
iostream
>
#include
<
algorithm
>
using
namespace
std;
class
PrintInt
...
{ public : void operator ()( int elem) const ... { cout << elem << " " ; } }
;
int
main()
...
{ vector < int > coll; for ( int i = 1 ;i < 9 ; ++ i) coll.push_back(i); for_each(coll.begin(),coll.end(),PrintInt()); cout << endl; return 0 ; }