• (六)STL序列容器(list)


    list: 底层实现为双向链表

    1、基本用法

    #include <iostream>
    #include <list>
    using namespace std;
    
    // list:双向链表
    void ShowPrint(list<int> d)
    {
        for (list<int>::iterator it = d.begin(); it != d.end(); ++it) {
            cout << *it << endl;
        }
    }
    int main()
    {
        list<int>val;
        val.push_back(1);
        val.push_back(9);
        val.push_back(5);
    
        val.sort();
        ShowPrint(val);
        system("pause");
        return 0;
    }

    访问元素

    #include <iostream>
    #include <list>
    using namespace std;
    
    /*
    访问:不支持随机访问
        未提供[]、at()、data()成员函数
    */
    int main()
    {
        // 可以通过front和back访问
        list<int> a{ 1,2,3,4 };
        int& first = a.front();
        int& last = a.back();
        cout << first << " " << last << endl;
    
        first = 90;
        last = 80;
        cout << first << " " << last << endl;
    
        // 访问其他元素,只能通过迭代器
        list<int>b{ 1,2,3,4 };
        auto it = b.begin();
        cout << *it << endl;
        ++it;
    
        while (it != b.end()) {
            cout << *it << endl;
            ++it;
        }
    
        system("pause");
        return 0;
    }
    

      

    删除元素

    #include <iostream>
    #include <list>
    using namespace std;
    
    void ShowPrint(list<int> a) 
    {
        for (auto i = a.begin(); i != a.end(); i++) {
            cout << *i << " ";
        }
        cout << endl;
    }
    /*
    erase():根据被删除元素所在的下标位置来进行删除
    remove():根据元素的值删除
    */
    int main()
    {
        list<int>val{ 1,22,3,4 };
        auto del = val.begin();
        ++del;
        val.erase(del);
        ShowPrint(val);
    
        val.remove(3);
        ShowPrint(val);
    
        system("pause");
        return 0;
    }

     

    2、迭代器失效

    list:插入(insert)、接合(splice())都不会造成原有的迭代器失效,甚至进行删除操作,只有指向被删除元素的迭代器失效,其它迭代器不受任何影响;

    进行插入后,仍然使用先前创建的迭代器遍历,程序不出错,但是插入的位置不同,可能会遗漏新插入的元素

    #include <iostream>
    #include <list>
    using namespace std;
    
    // list:双向链表
    void ShowPrint(list<int> d)
    {
        for (list<int>::iterator it = d.begin(); it != d.end(); ++it) {
            cout << *it << endl;
        }
    }
    int main()
    {
        list<int> x {11, 22, 33, 44, 55, 66, 77, 88, 99};
        // 创建begin和end迭代器
        list<int>::iterator begin = x.begin();
        list<int>::iterator end = x.end();
        // 头部和尾部插入字符w
        x.insert(begin, 520);   // 漏掉显示
        x.insert(end, 248);
    
        while (begin != end) {
            cout << *begin<<" ";
            ++begin;
        }
    
        cout << endl;
    
        list<int>::iterator b1 = x.begin();
        list<int>::iterator b2 = x.end();
        while (b1 != b2) {
            cout << *b1 << " ";
            ++b1;
        }
    
        system("pause");
        return 0;
    }
    

      

    做一个优秀的程序媛
  • 相关阅读:
    冒泡排序
    线程同步
    线程取消
    线程分离
    第3月第2天 find symbolicatecrash 生产者-消费者 ice 引用计数
    第3月第1天 GCDAsyncSocket dispatch_source_set_event_handler runloop
    第2月第25天 BlocksKit
    第2月第24天 coretext 行高
    第2月第6天 iOS 运行时添加属性和方法
    第2月第5天 arc invocation getReturnValue
  • 原文地址:https://www.cnblogs.com/oytt/p/13962491.html
Copyright © 2020-2023  润新知