C++标准程序库学习笔记

容器可分为两类:

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值