STL-list

List使用双向链表来管理元素
这里写图片描述

  • 使用list,必须包含#include< list >
  • list是定义与namespace std中的template
  • list不支持随机存取,所以也不提供下标操作符和at()
  • 任何位置上插入、删除元素都非常快
  • 插入、删除元素不会造成reference、pointers、iterators失效
  • list不提供容量,空间重新分配等操作函数,每个元素都有自己的内存,在被删除之前一直有效
  • list提供一些特殊函数,例如:unique(),sort(),merge(),reverse();这些函数执行起来更快,因为它们无需拷贝或移动,只需调整若干指针即可
  • list异常处理
    这里写图片描述
//练习代码
#include<iostream>
using namespace std;
#include<list>

void Funtest()//list的构造函数和拷贝构造函数
{
    list<int> L; //构造一个空的list
    list<int> L1(12);//构造一个有12个元素的list,这些元素都用default构造函数初始化
    list<int> L2(12,8);//构造一个有12个元素的list,每个元素初始值为8
    list<int> L3(L2);//用L2拷贝构造一个L3
    list<int>::iterator it = L3.begin();
    list<int>::iterator it1 = L3.end();
    list<int> L4(it,it1);//构造一个list,并以区间[it,it1]内的元素为初始值
}
void Funtest1()
{
    list<int> L;
    list<int> L1(10);
    cout << "L.size = " << L.size() << endl;//返回list元素个数
    cout << "L.size = " << L.max_size()<< endl;//返回list元素最大可能容量

    cout << "L1.size = " << L1.size() << endl;

    if (L.empty())//判断list是否为空
        cout << "L is NULL" << endl;
    else
        cout << "L is not NULL" << endl;
    if (L == L1)
        cout << "L == L1" << endl;
    else if (L < L1)
        cout << "L < L1" << endl;
    else
        cout << "L > L1" << endl;

    L.swap(L1);//交换两个list
    swap(L,L1);

    L = L1;//赋值

    L.assign(4,8);//将4个8拷贝给L
    L.assign(L1.begin(),L1.end());//将区间[L1.begin(),L1.end()]的元素拷贝给L

    //front、back都不检查元素是否存在
    cout << L1.front() << endl;//返回L1第一个元素
    cout << L1.back()  << endl;//返回L1最后一个元素
}
void Funtest2()//迭代器
{
    list<int> L;
    L.push_back(1);
    L.push_back(2);
    L.push_back(3);

    list<int>::iterator it;
    list<int>::iterator it1;
    list<int>::iterator it2;
    list<int>::iterator it3;

    //it = L.begin();//指向第一个元素
    //it1 = L.end();//指向最后一个元素的下一位置

    //it = L.rbegin();//指向逆向的第一个元素
    //it3 = L.rend();//指向逆向的最后一个元素的下一位置
}

void Funtest3()//插入、移除
{
    list<int> L;
    list<int> L1(5,1);

    list<int>::iterator it = L.begin();
    L.insert(it,1);//在pos位置插入1
    L.insert(it,3,3);//在pos位置插入3个值为3的元素
    L.insert(it,L1.begin(),L1.end());//在pos位置插入区间[L1.begin(),L1.end()]的元素

    L.erase(L.begin());//移除迭代器所指元素,返回下一个元素位置
    L1.erase(L1.begin(),L1.end());//移除区间[]上的元素,返回下一个元素位置

    L.push_back(6);//尾插
    L.pop_back();//尾删

    L.push_front(12);//头插
    L.pop_front();//头删

    L.remove(1);//移除值为1的元素

    L.resize(12);//将元素的数量改为12,如果size()变大,则多出的新元素都需要default构造函数构造完成
    L.resize(2);
    L.resize(12, 8);//将元素的数量改为12,如果size()变大,则多出的新元素都是8
    L.resize(2, 8);

    L.clear();//清空list

    //L.remove_if(op)//???????
}
void Funtest4()
{
    list<int> L;
    list<int> L1;
    list<int> L2(2);

    L1.push_back(3);
    L1.push_back(1);
    L1.push_back(2);

    L.push_back(4);
    L.resize(4,1);
    L.push_back(3);
    L.resize(7, 2);

    L.unique();//移除重复的元素

    //L.splice(L.begin(),L1);
    //L.splice(L.begin(),L1,L1.begin());
    //L.splice(L.begin(),L1, L1.begin(),L1.end());
    //L.splice(L.rbegin(), L1);

    L.sort();//排序
    L1.sort();
    L.merge(L1);//将L1的元素转移到L中并且保证L1有序,L1中元素清空(必须L1,L已序)
    L.reverse();//将元素反序
    L1.reverse();
}
int main()
{
    //Funtest();
    //Funtest1();
    //Funtest2();
    //Funtest3();
    Funtest4();
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值