STL之list

stl在编程中真是太重要了,计划近期将几个常用的容器好好研究下。
list是双向循环链表,
list每次增加一个元素,只需为新增节点申请一个单元,不存在重新申请所有内存的情况,它的成本是恒定的。而vector每当增加关键元素的时候,都需要重新申请新的更大的内存空间,会调用元素的自身的复制构造函数,存在构造成本。在销毁旧内存的时候,会调用析构函数,存在析构成本。所以在存储复杂类型和大量元素的情况下,list比vector更有优势

下面代码用到了list的一个初始化方法和增加元素的方法
注意用指针初始化时第二个指针指向最后一个元素的下一位置。

int data[6]={3,5,7,9,2,4};  
list<int> lidata(data, data+6);  
lidata.push_back(6);  

list的所有成员函数:

front() 返回第一个元素
back() 返回最后一个元素
begin() 返回指向第一个元素的迭代器
end() 返回末尾的迭代器
rbegin() 返回指向第一个元素的逆向迭代器
rend() 指向list末尾的逆向迭代器

pop_back() 删除最后一个元素
pop_front() 删除第一个元素
push_back() 在list的末尾添加一个元素
push_front() 在list的头部添加一个元素

clear() 删除所有元素
empty() 如果list是空的则返回true
erase() 删除一个或一个范围元素
insert() 插入一个元素到list中
remove() 从list删除元素
remove_if() 按指定条件删除元素

get_allocator() 返回list的配置器
assign() 给list赋值

splice() 合并两个list
merge() 合并两个list

max_size() 返回list能容纳的最大元素数量
size() 返回list中的元素个数
resize() 改变list的大小

reverse() 把list的元素倒转
sort() 给list排序
swap() 交换两个list
unique() 删除list中重复的元素

#include <iostream>
#include <list>
#include <string>  
#include <numeric> //accumulate函数
#include <algorithm>   //sort函数
using namespace std;
int cmp1(int a,int b)
{
return a<b;
}

namespace std{
/*struct greater<int>: binary_function<int, int, int>{
    int operator()(int a,int b) const
    {
        return a<b; 
    }
*/
//sort成员函数自定义比较函数时只认greater<类型>
 struct greater<int> {
     bool operator() (int x, int y) const 
         {return x>y;}
};

}

bool single_digit(const int& value){return(value<3);}

class is_odd
{
public:
  bool operator() (const int& value) {return (value%2)==1; }
};




int main()
{
    typedef list<int> listc;
    int a[]={7,5,6,4,3,2,1};
    listc list1(a,a+sizeof(a)/sizeof(int)); //sizeof(a)/sizeof(int)=7

    //显示list中元素
    listc::iterator it0=list1.begin();
    while(it0!=list1.end())
    {
        cout<<*it0<<" ";
        it0++;
    }
    cout<<endl;



//stl算法
//数组也可以用accumulate来求和int sum=accumulate(a,a+sizeof(a)/sizeof(int),0),前两个参数用指针表示范围,第三个参数表示累加初始值
//求list中最大和最小值,第三个参数可以自定义,也可以不要该参数
    reverse(list1.begin(),list1.end());

    //sort(list1.begin(),list1.end());此调用是错误的,STL的sort函数只能为提供随机存取元素的容器里面的元素排序,而list是链表,不能随机存取,排序时有专门的自己的成员函数可供使用
    list1.sort();
    list1.sort(greater<int>());    //从大到小排列  list1={7,6,5,4,3,2,1}

    //显示list中元素
    it0=list1.begin();
    while(it0!=list1.end())
    {
        cout<<*it0<<" ";
        it0++;
    }
    cout<<endl;


    int sum=accumulate(list1.begin(),list1.end(),0);  //sum=28

    listc::iterator it1=max_element(list1.begin(),list1.end(),cmp1);  //*it1=7
    listc::iterator it2=min_element(list1.begin(),list1.end(),cmp1);  //*it2=1 

//list的正反向迭代器
    listc::iterator it3=list1.begin();
    listc::reverse_iterator it4=list1.rbegin();

//从前面和后面向listOne容器中添加,删除数据
    list1.push_front (0);
    list1.push_back (10);        //    list1={0,...,10}
    list1.pop_front ();
    list1.pop_back ();          //    list1={...}



    int s=list1.front();   //表示list第一个元素s=7;
    int e=list1.back();    //表示list最后一个元素e=1;

    bool f=list1.empty();   // 如果list是空的则返回true ,这里f=false;

//  listc::iterator it5=list1.find(1);   //错误,没有find成员函数
    list1.insert(it3,99);
    cout<<*it3<<endl;        //此时it3仍然指向原来的元素7


//  list1.erase(list1.begin(),list1.begin()+2); //错误,list迭代器不支持+n,只能++
    listc::iterator s1=list1.begin();   
    listc::iterator s2=s1;   
    for(int j=1;j<3;j++)
        s2++;
    list1.erase(s1,++s2);  //将(s1...s2-1)范围内元素删除



//  cout<<*s1<<endl; //错误,it3此时失效,输出是未知的
    cout<<*s2<<endl;  //正确

    list1.push_back(1);
    list1.push_front(1);
//  list1.unique(); //使用错误,不管是STL还是成员函数,必须先进行排序,才能使用unique,
    list1.sort();
    list1.unique();        //删除重复的元素

    int b[]={3,3,3,4,4,4};
    listc list2(b,b+6);
    /*
    list1.swap(list2);   //list1和list2的内容互换
    list1.splice(++list1.begin(),list2);   //list2变为空,在list1的第二个元素之前插入list2
    cout<<list1.size()<<endl;  //11
    cout<<list2.size()<<endl;  //0
*/
    list1.merge(list2);  //合成一个表按升序排序
    cout<<list1.size()<<endl;  //11
    cout<<list2.size()<<endl;  //0

    list1.remove(3);


    list1.remove_if(is_odd());   //编译出错,没整明白,有待研究、、、、、、、、、、、、、、、、、、、、、、、、、、、

    //显示list中元素
    it0=list1.begin();
    while(it0!=list1.end())
    {
        cout<<*it0<<" ";
        it0++;
    }
    cout<<endl;

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值