zoukankan      html  css  js  c++  java
  • C++ STL List使用

    一、简介

    1. 资料位置,Reference:http://www.cplusplus.com/reference/list/list/

    2. Lists将元素按顺序储存在链表中。与向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢。(vector支持快速随机访问)

    3. 下面是几个list特有的函数

    remove()    //从list删除元素
    remove_if() //按指定条件删除元素
    reverse()   //把list的元素倒转
    sort()      //给list排序
    unique()    //删除list中重复的元素

    4. 对比 vector 和 list 在查询(随机检索)和维护(插入和删除)上的区别
    (1) 查询
    vector:由于 vector 中的元素是连续存储的,所以我们能够直接的访问第n个元素。
    list:由于list中的元素不是在内存中连续存储的,下一个元素的内存地址保存在前一个元素中,所以我们必须一个一个的访问前面的元素,最后才能访问第n个元素。
    (2) 维护
    vector:在 vector 中插入/删除一个元素的话,我们需要移动插入/删除位置之后的所有元素。如果在vector插入/删除元素后有大量元素的情况下,这些移动和删除操作会大量的消耗CPU时间。
    list:使用list进行这些操作的时候,其仅仅是修改插入/删除元素之前的元素到后一个元素的指针则可以完成这些操作,这样可以节约大量的CPU时间。

    二、例子

    1. int型测试链表

    #include <list> 
    #include <iostream> 
    #include <algorithm> 
    
    using namespace std; 
    
    //用于提供回调
    void print(int num) 
    { 
        cout << num << " "; 
    } 
    
    //用于提供回调 
    bool IsOdd(int i) 
    { 
        return ((i & 1) == 1); 
    } 
    
    int main() 
    { 
        //1. 初始化 
        list<int> v;
        list<int>::iterator iv;
    
        v.assign(10, 2); //将10个值为2的元素赋到list中
        cout << v.size() << endl; //返回list实际含有的元素数量
        cout << "-----------1------------" << endl;
    
        //2. 添加
        v.push_front(666);
        for (int i = 0; i < 10; i++){
            v.push_back(i);
        }
        for_each(v.begin(), v.end(), print);//需要#include <algorithm>
        cout << endl;
        cout << v.size() << endl;
        cout << "-----------2------------" << endl;
    
        //3. 插入及遍历、逆遍历和倒转
        v.insert(v.begin() , 99);//不能+和-了
        v.insert(v.end() , 88);
    
        for_each(v.begin(), v.end(), print);
        cout << endl;
        for_each(v.rbegin(), v.rend(), print);//在逆序迭代器上做++运算将指向容器中的前一个元素
        cout << endl;
        cout << "-----------3------------" << endl;
    
        //一般遍历写法
        for(iv = v.begin(); iv != v.end(); ++iv)
        cout << *iv << " ";
        cout << endl;
        cout << "-----------4------------" << endl;
    
        v.reverse();
        for_each(v.begin(), v.end(), print);
        cout << endl;
        for_each(v.rbegin(), v.rend(), print);
        cout << endl;
        cout << "-----------5------------" << endl;
    
        //4. 排序 
        v.sort();//为链表排序,默认是升序
        for_each(v.begin(), v.end(), print);
        cout << endl;
        cout << "-----------6------------" << endl;
    
        //5. 删除 
        v.erase(v.begin());
        for_each(v.begin(), v.end(), print);
        cout << endl;
        v.insert(v.begin() , 99);//还原
        for_each(v.begin(), v.end(), print);
        cout << endl;
        cout << "-----------7------------" << endl;
    
        //删掉链表中所有重复的元素
        v.unique();
        for_each(v.begin(), v.end(), print);
        cout << endl;
        cout << "-----------8------------" << endl;
    
        //去掉所有含2的元素
        v.remove(2);
        for_each(v.begin(), v.end(), print);
        cout << endl;
        cout << "-----------9------------" << endl;
    
        //删掉所有奇数
        v.remove_if(IsOdd);
        for_each(v.begin(), v.end(), print);
        cout << endl;
        cout << "-----------10------------" << endl;
    
        //掐头去尾
        v.pop_front();
        v.pop_back();
        for_each(v.begin(), v.end(), print);
        cout << endl;
        cout << "-----------11------------" << endl;
    
        //6. 查询
        cout << v.front() << endl;
        cout << v.back() << endl;
        cout << "-----------12------------" << endl;
    
        //7. 清空
        v.clear();
        cout << v.size() << endl;//0
        for_each(v.begin(), v.end(), print); //已经clear,v.begin()==v.end(),不会有任何结果。
        cout << "-----------13------------" << endl;
    
        return 0;
    }
    
    /*
    //运行结果
    # ./qq
    10
    -----------1------------
    666 2 2 2 2 2 2 2 2 2 2 0 1 2 3 4 5 6 7 8 9 
    21
    -----------2------------
    99 666 2 2 2 2 2 2 2 2 2 2 0 1 2 3 4 5 6 7 8 9 88 
    88 9 8 7 6 5 4 3 2 1 0 2 2 2 2 2 2 2 2 2 2 666 99 
    -----------3------------
    99 666 2 2 2 2 2 2 2 2 2 2 0 1 2 3 4 5 6 7 8 9 88 
    -----------4------------
    88 9 8 7 6 5 4 3 2 1 0 2 2 2 2 2 2 2 2 2 2 666 99 
    99 666 2 2 2 2 2 2 2 2 2 2 0 1 2 3 4 5 6 7 8 9 88 
    -----------5------------
    0 1 2 2 2 2 2 2 2 2 2 2 2 3 4 5 6 7 8 9 88 99 666 
    -----------6------------
    1 2 2 2 2 2 2 2 2 2 2 2 3 4 5 6 7 8 9 88 99 666 
    99 1 2 2 2 2 2 2 2 2 2 2 2 3 4 5 6 7 8 9 88 99 666 
    -----------7------------
    99 1 2 3 4 5 6 7 8 9 88 99 666 
    -----------8------------
    99 1 3 4 5 6 7 8 9 88 99 666 
    -----------9------------
    4 6 8 88 666 
    -----------10------------
    6 8 88 
    -----------11------------
    6
    88
    -----------12------------
    0
    -----------13------------
    
    */

    2. char*型测试list

    #include<iostream>
    #include<string>
    #include<list>
    
    using namespace std;
    
    int main()
    {
        list<char *> li;
        list<char *>::iterator iter;
        li.push_back("123");
        li.push_back("456");
        li.push_back("789");
        for (iter = li.begin(); iter != li.end(); ++iter) {
            cout << *iter << endl;
        }
        return 0;
    } 
    
    /*
    //运行结果
    # ./pp
    123
    456
    789
    */
  • 相关阅读:
    操作系统简介
    计算机基础
    Django之form
    CMDB资产采集
    Git
    User model
    多级评论
    个人主页
    media路径设置
    Web框架
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/14586111.html
Copyright © 2011-2022 走看看