双向循环链表--list容器的具体实现

#include<iostream>
#include<list>//类似于双向循环链表
using namespace std;

void show(list<int>l){//输出容器list中的内容
    for(list<int>::iterator it=l.begin();it!=l.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;
}
//正因为list容器是序列式容器,所以list的迭代器只能前移或后移,不能一次移动多个位置
//在网上没有找到明确说明两者是因果关系. 这句话是我的猜想


//list构造函数
void test1(){
    list<int>l1;//默认构造形式
    //show(l1);//空容器

    l1.push_back(10);
    l1.push_back(20);
    l1.push_back(30);
    l1.push_back(40);
    //show(l1);//10 20 30 40 

    //构造函数将区间中的元素拷贝给本身
    list<int>l2(l1.begin(),l1.end());
    //show(l2);//10 20 30 40

    //拷贝构造函数
    list<int>l3(l2);
    //show(l3);//10 20 30 40

    //将n个elem拷贝给本身
    list<int>l4(5,100);
    //show(l4);//100 100 100 100 100
}

//list赋值
void test2(){
    list<int>l1;
    l1.push_back(10);
    l1.push_back(20);
    l1.push_back(30);
    l1.push_back(40);

    list<int>l2;
    l2=l1;//重载了等号  可以直接容器直接赋值
    cout<<"l1容器里的数据为:";//10 20 30 40
    show(l1);
    cout<<"l2容器里的数据为:";//10 20 30 40
    show(l2);

    list<int>l3;
    l3.assign(l2.begin(),l2.end());//内置函数 可以以区间形式赋值
    show(l3);//10 20 30 40

    list<int>l4;
    l4.assign(5,10);//assign函数也支持n个elem值拷贝赋值
    show(l4);//10 10 10 10 10
}

//list交换
void test3(){
    list<int>l1;
    l1.push_back(10);
    l1.push_back(20);
    l1.push_back(30);
    l1.push_back(40);

    list<int>l2;
    l2.push_back(100);
    l2.push_back(200);

    cout<<"交换前"<<" ";
    cout<<"l1=";
    show(l1);//10 20 30 40 
    cout<<"l2=";
    show(l2);//100 200

    cout<<"交换后"<<" ";
    l1.swap(l2);
    cout<<"l1";
    show(l1);//100 200
    cout<<"l2=";
    show(l2);//10 20 30 40
}

//list大小操作
void test4(){
    list<int>l1;
    l1.push_back(10);
    l1.push_back(20);
    l1.push_back(30);
    l1.push_back(40);

    //empty()和size()可以作为表达式的一部分处理
    //但是如果拿变量来接受值 再输出变量则不能实现
    cout<<"l1容器是否为空"<<l1.empty()<<endl;//0
    cout<<"l1的大小为"<<l1.size()<<endl;//4

    l1.resize(6);//重新定义容器大小,如果变大则以默认值来填充
    show(l1);//10 20 30 40 0 0

    l1.resize(6,100);//重新定义容器大小,如果变大则以给定的elem来填充
    show(l1);//10 20 30 40 100 100

    l1.resize(2);//重新定义容器大小,如果变小则删除超出范围的数据
    show(l1);//10 20 
}

//list 插入和删除
void test5(){
    //list<int>l1;
    //l1.push_back(10);//list容器尾部加入一个元素
    //l1.push_front(20);//list容器开头加入一个元素
    //l1.pop_back();//删除容器最后一个元素
    //l1.pop_front();//删除容器开头一个元素

    list<int>l1;
    l1.push_back(10);
    l1.push_back(20);
    l1.push_back(30);
    
    list<int>::iterator it=l1.begin();//通过迭代器的移动来访问位置
    l1.insert(++it,100);//在第二个位置插入100
    show(l1);//10 100 20 30

    l1.insert(it,2,99);//迭代器的位置不变,插入2个99
    show(l1);//10 100 99 99 20 30

    list<int>l2;
    l2.push_back(1);
    l2.push_back(2);
    l1.insert(it,l2.begin(),l2.end());//插入区间的元素
    show(l1);//10 100 99 99 1 2 20 30

    l2.clear();//清空容器
    show(l2);

    l1.erase(l1.begin());//删除指定位置元素
    show(l1);//100 99 99 1 2 20 30

    list<int>::iterator itt=l1.begin();
    l1.erase(++itt,l1.end());//删除区间元素
    show(l1);//100 

    l1.push_back(66);//移除所有与66想匹配的元素
    show(l1);//100 66
    l1.remove(66);
    show(l1);//100
}

//list开头和结尾数据读取
void test6(){
    list<int>l1;
    l1.push_back(10);
    l1.push_back(20);
    l1.push_back(30);

    //迭代器不支持随机访问
    cout<<"l1的第一个元素为"<<l1.front()<<endl;//10
    cout<<"l1的最后一个元素为"<<l1.back()<<endl;//30
}

bool compare(int v1,int v2){
    return v1>v2;//降序
}
void test7(){
    list<int>l1;
    l1.push_back(10);
    l1.push_back(20);
    l1.push_back(30);
    show(l1);//10 20 30

    l1.reverse();//将容器中的元素反转
    show(l1);//30 20 10

    l1.push_back(15);
    show(l1);//10 20 30 15
    l1.sort();//从小到大排序{默认} sort函数是内部提供的方法
    show(l1);//10 15 20 30

    l1.sort(compare);//逆序
    show(l1);//30 20 15 10
    /*
    sort的逆序我vc6.0一直在报错 
    不知道为什么,代码应该没问题
    还有一种逆序的思路是 可以将容器先升序然后reverse反转一下
    */
}


int main(){
    /*
    test1(); 构造
    test2(); 赋值
    test3(); 交换
    test4(); 大小操作
    test5(); 插入和删除
    test6(); 数据存取
    test7(); 反转和排序
    */
    return 0;
}

 

posted @ 2021-01-23 17:27  大耿2844  阅读(152)  评论(0)    收藏  举报