STL-list

来源:互联网 发布:巴蜀中学教师待遇知乎 编辑:程序博客网 时间:2024/04/28 04:40

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 0