美文网首页c++C++程序员
c++那些事儿11.0 STL--List

c++那些事儿11.0 STL--List

作者: 知识学者 | 来源:发表于2017-09-21 16:13 被阅读70次

    首先对STL不熟悉的同学,可以先看看这篇文章里有些东西:

    STL中容器相关知识点

    知识点综述:

    List:序列式容器,双向链表,在内存中不连续存放。
    优点: 插入,删除元素效率高。

    STL的基本知识点:

    1.0 容器:容纳各种数据类型的通用数据结构,是类模板。
    2.0 迭代器:可以依次存取容器的元素,类似指针。
    3.0 算法用来操作容器中元素的函数模板。



    list数据结构: list.PNG

    list相关函数:

    list相关函数.PNG

    相关代码:

    
    #include<iostream>
    #include<list>
    #include<string>
    #include<cstdlib>
    #include <algorithm> 
    #include<ctime>
    #include<fstream>
    
    using namespace std;
    // void displayfor(list<int> li);
    void displayiterator(list<int> li);
    void displayforeach(list<int> li);
    void randList(list<int> &li);
    void writeFile(list<int> li);
    int main() 
    {  
        //创建vector对象。
        list<int> li; //容器为空。
    
                         //bool empty() 判断容器是否为空(返回true时为空)
        cout << "li 是否为空:" <<li.empty() << endl;
    
        //void push_back()在容器对象末尾添加新元素
        li.push_back(16); //添加元素
        li.push_back(18);
        li.push_back(19);
    
        //int size() 返回容器的大小(元素的数目)
        int size = li.size();
        cout << "容器的大小:" << size << endl;
    
        displayforeach(li);
        cout << endl << "---------------------" << endl;
    
        //void pop_back() 删除容器对象末尾的元素
        cout << "删除容器对象末尾的元素." << endl;
        li.pop_back();
        displayiterator(li); //迭代器遍历
        cout << endl << "---------------------" << endl;
    
    
        /*void insert() 在容器对象末尾插入一个或多个元素
        iterator insert(iterator loc, const TYPE &val);
        void insert(iterator loc, size_type num, const TYPE &val);
        void insert(iterator loc, input_iterator start, input_iterator end);
        insert() 函数有以下三种用法:
        在指定位置loc前插入值为val的元素, 返回指向这个元素的迭代器,
        在指定位置loc前插入num个值为val的元素
        在指定位置loc前插入区间[start, end)的所有元素 .
        */
        list<int>::iterator iter1 = li.end();
        list<int>::iterator iter2 = li.begin();
        li.insert(iter1, 22);
        li.insert(iter2, 33);
        cout << "头部和尾部分部追加一个元素" << endl;
        displayforeach(li);  //foreach遍历
        cout << endl << "---------------------" << endl;
    
    
        // int max_size() 
        cout << "容器的最大的容量:" << li.max_size() << endl;
    
        list<int> li1(6, 8);
        cout << "li的元素:";
        displayforeach(li1);
    
        // void swap()  交换两个容器的对象
        cout << endl << "---------------------" << endl;
        li.swap(li1);
        cout << "交换li和li1 " << "li的元素:";
        displayiterator(li);
        cout << endl;
    /*
        //int reserve(int n)  设置容器最小的元素容纳数量
        li.reserve(9);
        cout << endl << "容器的最大的容量:" << vec.capacity() << endl;
        cout << "容器的大小:" << vec.size() << endl;
    */
    
    //void clear() 删除容器对象的所有元素。
        li.clear();
        cout << " 删除容器vec对象的所有元素" << " vec的元素:";
        displayforeach(li);
        cout << endl << "---------------------" << endl;
    
    
    
            //void clear() 删除容器对象的所有元素。
            li.clear();
        cout << " 删除容器vec对象的所有元素" << " vec的元素:";
        displayforeach(li);
        cout << endl << "---------------------" << endl;
    
        randList(li);  //随机生产数字放入 list中。
        cout << endl;
        list<int> li2;
    
        /*list特有的函数
        void assign( input_iterator start, input_iterator end );
        void assign( size_type num, const TYPE &val );
        assign()函数以迭代器start和end指示的范围为list赋值
        或者为list赋值num个以val为值的元素。s
    
    
        */
        li2.assign(li.begin(), li.end());
        cout << "li的元素:";
        displayforeach(li);
        cout << endl;
        cout << "li2中的元素:";
        displayiterator(li2);
    
    //back() 返回最后一个元素 
    //front() 返回第一个元素 
        cout << endl;
        cout << "li最后一个元素:" << li.back() << endl;
        cout<< "li第一个元素:" << li.front() << endl;
        cout << "---------------------" << endl;
    
    /*
    iterator erase( iterator pos );
    iterator erase( iterator start, iterator end );
    */
        cout << "删除第2个元素:" << endl;
        list<int>::iterator lit = li.begin();
        lit++;
        li.erase(lit);
        cout << "li的元素:";
        displayforeach(li);
        cout << endl;
    
    //  void reverse();
    //  reverse()函数把list所有元素倒转。
        cout << "li的元素倒置:" << endl;;
        li.reverse();
        cout << "li的元素:";
        displayforeach(li);
        cout << endl;
    
    /* void sort();
      void sort(Comp compfunction);
    sort()函数为链表排序,默认是升序。如果指定compfunction的话,
        就采用指定函数来判定两个元素的大小。
    */
        li.sort();
        cout << "li升序排列:";
        displayforeach(li);
        cout << endl;
    
    /*
    
    void splice( iterator pos, list &lst );
    void splice( iterator pos, list &lst, iterator del );
    void splice( iterator pos, list &lst, iterator start, iterator end );
    splice()函数把lst连接到pos的位置。如果指定其他参数,
    则插入lst中del所指元素到现链表的pos上,或者用start和end指定范围。
    
    */
        li2.clear();
        randList(li2);
        cout << endl;
        cout << "li2的元素:";
        displayforeach(li2);
        li.splice(li.end(), li2);
        cout << endl;
        cout<<"把li2链接到li末尾:"<<endl << "li的元素:";
        displayforeach(li);
        cout << endl;
    
    
    //unique() 删除list中重复的元素 
        li.unique();
        cout << " 删除list中重复的元素 " << endl;
        cout << "li的元素:";
        displayforeach(li);
        cout << endl;
    
    //把 li的数据保存到文件中。
        writeFile(li);
    
        system("pause");
        return 0;
    }
    
    /*
    rand
    语法:int rand( void );
    功能: 函数返回一个在零到RAND_MAX 之间的伪随机整数。
    例如: srand( time(NULL) );   
          for( i = 0; i < 10; i++ )     
          printf( "Random number #%d: %d\n", i, rand() );
    srand
    语法: void srand( unsigned seed );
    功能: 设置rand()随机序列种子。对于给定的种子seed, rand()会反复产生特定的随机序列。     
    srand( time(NULL) );    
    for( i = 0; i < 10; i++ )      
    printf( "Random number #%d: %d\n", i, rand() );
    
    */
    
    void randList(list<int> &li) {
        srand((int) time(NULL));
        for (int i = 0; i <8; i++)
        {
            li.push_back(rand()%100);
        }
    }
    
    
    //迭代器遍历
    void displayiterator(list<int> li) {
        /*
        iterator begin() 返回指定容器对象的首元素的迭代器。
        iterator end() 返回指定容器对象的末元素后面位置的迭代器
        */
        list<int>::iterator ite;
        for (ite = li.begin(); ite!=li.end(); ite++)
            cout << *ite << " ";
    }
    
    //foreach遍历
    void displayforeach(list<int>li) {
        for (int i : li) {
            cout << i << " ";
        }
    }
    
    void writeFile(list<int> li) {
        cout << "数据写入文件" << endl;
    
        ofstream ofs("D:\\works_c++\\list.txt");
        list<int>::iterator it;
        for (it = li.begin(); it != li.end(); it++)
            ofs << *it << " ";
    }
    
    
    

    结果:

    结果.PNG 文件.PNG

    对C++ I/O流不熟悉的同学,可以看看这篇文章:
    c++那些事儿7.0 I/O流,文件操作

    参考文献:

    C++容器之list
    C++ vector和list的区别
    C++中list用法详解
    c++ 容器(list学习总结)
    C++ List的用法(整理)

    今天早上跑步了,坚持继续加油.
    

    c++ 的文章可以写许多,c11还有好多东西,其实我想写java了。

    相关文章

      网友评论

        本文标题:c++那些事儿11.0 STL--List

        本文链接:https://www.haomeiwen.com/subject/wsyasxtx.html