zoukankan      html  css  js  c++  java
  • [转]C++ STL list的初始化、添加、遍历、插入、删除、查找、排序、释放

    list是C++标准模版库(STL,Standard Template Library)中的部分内容。实际上,list容器就是一个双向链表,可以高效地进行插入删除元素。

    使用list容器之前必须加上STL的list容器的头文件:#include<list>;

    list属于std命名域的内容,因此需要通过命名限定:using std::list;也可以直接使用全局的命名空间方式:using namespace std;

    (1)初始化

    typedef struct info_s

    {

    int nNumber;

    }info_t;

    typedef std::list< info_t > list_t;

    定义list的类型

    list_t  List;  //定义一个空的链表

    list_t  List(count); //建一个含count个默认值是0的元素的链表

    list_t  List(count, info); //建一个含count个默认值是info的元素的链表

    list_t  List(List2);   //建一个的copy链表

    list_t  List(List2.begin(),List2.end());   //含区间的元素[First,Last]

    (2)添加(添加到末尾)

    info_t info;

    //Set(info)

    List.push_back(info);

    将会添加到末尾

    (3)遍历

    list_t::iterator iter;

    for(iter = List.begin(); iter != List.end() ;iter++)

    {

    std::cout<< iter->nNumber <<std::endl;

    }

    (4)删除末尾元素

    c++的stl list 提供pop_back()函数来删除最后一个元素。

    List.pop_back();

    (5)删除所有元素

    简单粗暴的方法:调用clear()

    List.clear();

    遍历删除法,一个一个删除,这样的好处是,如果元素有申请内容或者系统资源,我们可以把他释放了,避免资源泄漏。

    list_t::iterator iter;

    for(iter = List.begin(); iter != List.end() ;)

    {

    //这里可以做是否内存或者资源的操作

    //

    iter =  List.erase(iter);  

    //iter指向了下一个元素

    }

    (6)插入

    iter = List.insert(iter , info);

    插入后iter指向新插入的元素。

    (7)查找

    list_t::iterator iter ;

    iter = std::find(List.begin(),List.end(), info);

    if(iter != List.end())

    {

    std::cout<<"find it"<<std::endl;

    }

    else

    {

    std::cout<<"not find it"<<std::endl;

    }

    注意结构体需要重载==运算符

    (8)排序

    List.sort();

    注意,结构体需要重载运算符<

    上代码

    #include <iostream>
    #include <list>
    #include <algorithm>

    #include <stdlib.h>
    #include <string.h>

    typedef struct info_s
    {
    int nNumber;
    bool operator==(struct info_s b) const
    {
    return this->nNumber == b.nNumber;
    }

    bool operator!=(struct info_s b) const
    {
    return this->nNumber != b.nNumber;
    }

    bool operator>=(struct info_s b) const
    {
    return this->nNumber >= b.nNumber;
    }

    bool operator<=(struct info_s b) const
    {
    return this->nNumber <= b.nNumber;
    }

    bool operator>(struct info_s b) const
    {
    return this->nNumber > b.nNumber;
    }

    bool operator<(struct info_s b) const
    {
    return this->nNumber < b.nNumber;
    }

    }info_t;

    typedef std::list< info_t > list_t;

    void append(list_t &List, info_t &info)
    {
    std::cout<<"***append****"<<std::endl;
    List.push_back(info);
    }

    void for_each(list_t &List)
    {
    std::cout<<"***for_each****"<<std::endl;
    list_t::iterator iter;
    for(iter = List.begin(); iter != List.end() ;iter++)
    {
    std::cout<< iter->nNumber <<std::endl;
    }
    }

    void del_end_info(list_t &List)
    {
    std::cout<<"***del_end_info****"<<std::endl;
    if(! List.empty())
    {
    List.pop_back();
    }
    }

    void for_each_delete(list_t &List)
    {
    list_t::iterator iter;
    for(iter = List.begin(); iter != List.end() ;)
    {
    std::cout<< "delete before iter->number:"<<iter->nNumber <<std::endl;
    iter = List.erase(iter);
    std::cout<< "delete after iter->number:"<< iter->nNumber <<std::endl;
    }

    }


    int insert_one(list_t &List , info_t &info, int iPlace)
    {
    int i = 0;

    std::cout<<"insert_one"<<std::endl;
    if(iPlace < 0)
    {
    std::cout<<"insert_one param error"<<std::endl;
    return -1;
    }

    list_t::iterator iter = List.begin();

    while(iter != List.end())
    {
    //std::cout<<" dump "<< (*iVector)<<std::endl;
    if(i == iPlace)
    {
    iter = List.insert(iter , info); //此时insert的返回值是迭代器,插入成功后iVector指向插入的位置
    std::cout<<" insert_one after List point "<<iter->nNumber <<std::endl;
    return 0;
    }

    i++;
    ++iter;
    }


    iter = List.insert(List.end() , info);

    return 0;
    }


    void find_one(list_t &List,info_t info )
    {

    std::cout<<"find_one"<<std::endl;

    list_t::iterator iter ;

    iter = std::find(List.begin(),List.end(), info);

    if(iter != List.end())
    {
    std::cout<<"find it"<<std::endl;
    }
    else
    {
    std::cout<<"not find it"<<std::endl;
    }

    }

    void Sort(list_t & List)
    {
    std::cout<<"Sort it"<<std::endl;
    List.sort();
    for_each(List);
    }

    int main()
    {
    //初始化
    list_t List;
    info_t info;
    memset(&info, 0, sizeof(info_t));

    //添加
    info.nNumber = 8;
    append(List, info);

    info.nNumber = 5;
    append(List, info);

    info.nNumber = 7;
    append(List, info);

    info.nNumber = 1;
    append(List, info);

    info.nNumber = 1;
    append(List, info);

    info.nNumber = 2;
    append(List, info);

    info.nNumber = 1;
    append(List, info);

    //遍历
    for_each(List);

    //插入
    info.nNumber = 80;
    insert_one(List,info,3);
    for_each(List);
    //查找
    find_one(List,info);

    //排序
    Sort(List);

    //删除末尾
    del_end_info(List);
    for_each(List);

    std::cout<< " size:"<<List.size()<<std::endl;

    //删除所有
    // List.clear();
    for_each_delete(List);
    for_each(List);
    std::cout<< " size:"<<List.size()<<std::endl;


    return 0;
    }

    ---------------------
    作者:zhouzhenhe2008
    来源:CSDN
    原文:https://blog.csdn.net/zhouzhenhe2008/article/details/77428743/
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    HDOJ 4747 Mex
    HDU 1203 I NEED A OFFER!
    HDU 2616 Kill the monster
    HDU 3496 Watch The Movie
    Codeforces 347A A. Difference Row
    Codeforces 347B B. Fixed Points
    Codeforces 372B B. Hungry Sequence
    HDU 1476 Sudoku Killer
    HDU 1987 How many ways
    HDU 2564 词组缩写
  • 原文地址:https://www.cnblogs.com/lyp-Bird/p/10376537.html
Copyright © 2011-2022 走看看