stl学习笔记6

 更易行算法(manipulating algorithms)指能够删除或者重排或者修改元素的算法。

 

// stl/remove1.cpp

/*
 remove 并不改变群集中的元素数量,end()返回的是当初的那个终点,size()返回原来的size。
*/

#include 
< iostream >
#include 
< list >
#include 
< algorithm >
using   namespace  std;

int  main()
{
    list
<int> coll;

    
for(int i =1;i<=6;++i)
    
{
        coll.push_front(i);
        coll.push_back(i);
    }


    cout 
<<"pre: ";
    copy(coll.begin(),coll.end(),ostream_iterator
<int>(cout," "));
    cout 
<<endl;

    
/* remove 后,数值为3的元素被其后的元素覆盖了,元素相当于前移,但是群集尾端的元素位置不变了,原封不动
    ** 但是逻辑上来说不属于这个群集了。
    
*/

    remove(coll.begin(),coll.end(),
3);

    cout 
<<"post: ";
    
// 这时候输出 6 5 4 2 1 1 2 4 5 6 5 6,最后两位不变,原封不动。
    copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
    cout 
<<endl;
}

//  Out Result

/*
** pre: 6 5 4 3 2 1 1 2 3 4 5 6
** post: 6 5 4 2 1 1 2 4 5 6 5 6
*/

 

 

// stl/remvoe2.cpp
#include  < iostream >
#include 
< list >
#include 
< algorithm >
using   namespace  std;

int  main()
{
    list
<int> coll;

    
for(int i =1; i<=6;++i)
    
{
        coll.push_front(i);
        coll.push_back(i);
    }


    
// 原始数据
    copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
    cout 
<<endl;

    
// 对整个群集进行遍历,把所有value为3 的值都删掉,最后的位置为删除所有元素后
    
// 的逻辑终点,这个终点在往后的元素不包含在群集以内。
    list<int>::iterator end = remove(coll.begin(),coll.end(),3);

    
// 打印出来
    copy(coll.begin(),end,ostream_iterator<int>(cout," "));
    cout 
<< endl;

    
// 逻辑终点与 coll.end() 的距离,本例是 2
    cout <<"number of removed elements: "
        
<<distance(end,coll.end())
        
<<endl;
    
// erase 会删除整个区间内的所有的元素
    coll.erase(end,coll.end());
    
// 打印出来
    copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
    cout 
<<endl;
}

 

 

// stl / remove3.cpp
#include  < iostream >
#include 
< set >
#include 
< algorithm >
using   namespace  std;

int  main()
{
    
set<int> coll;

    
for(int i =1; i<=9;++i)
    
{
        coll.insert(i);
    }

    copy(coll.begin(),coll.end(),ostream_iterator
<int>(cout," "));

    cout 
<<endl;

    
/* 书上说更易行算法用在set 这种关联式容器上 会出问题
    ** 不过这里好像没出错,以后再仔细研究下,从关联是容器中删除元素,用本
    ** 身提供的成员函数比较好
    
*/



    
/*
    set<int>::iterator pos;
    pos = remove(coll.begin(),coll.end(),3);
    
*/


    
// 成员函数的erase,删除元素为3,记录下删除了多少。
    size_t num = coll.erase(3);
    cout 
<<"number of removed elements: "<<num<<endl;
    copy(coll.begin(),coll.end(),ostream_iterator
<int>(cout," "));
    cout 
<<endl;
}


/*
1 2 3 4 5 6 7 8 9
number of removed elements: 1
1 2 4 5 6 7 8 9
*/

 

 

// stl/remove4.cpp
//
#include  < iostream >
#include 
< list >
#include 
< algorithm >
using   namespace  std;

int  main()
{
    list
<int> coll;

    
for(int i =1; i<6;++i)
    
{
        coll.push_front(i);
        coll.push_back(i);
    }


    cout 
<<"原始数据:";
    copy(coll.begin(),coll.end(),ostream_iterator
<int>(cout," "));
    cout 
<<endl;
    coll.erase(remove(coll.begin(),coll.end(),
3),coll.end());

    
// 效率比较低的移除方法,先移动,在擦除逻辑群集意外的元素
    cout <<"remove value 3: ";
    copy(coll.begin(),coll.end(),ostream_iterator
<int>(cout," "));
    cout 
<<endl;


    
// 直接删除,效率比较好
    cout <<"remove value 4: ";
    coll.remove(
4);
    copy(coll.begin(),coll.end(),ostream_iterator
<int>(cout," "));
    cout 
<<endl;
}


/*
原始数据:5 4 3 2 1 1 2 3 4 5
remove value 3: 5 4 2 1 1 2 4 5
remove value 4: 5 2 1 1 2 5
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值