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

首先對STL不熟悉的同學,可以先看看這篇文章里有些東西:

STL中容器相關知識點

知識點綜述:

List:序列式容器,雙向鏈表,在內存中不連續(xù)存放。
優(yōu)點: 插入,刪除元素效率高。

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() 
{  
    //創(chuàng)建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前插入區(qū)間[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的區(qū)別
C++中l(wèi)ist用法詳解
c++ 容器(list學習總結)
C++ List的用法(整理)

今天早上跑步了,堅持繼續(xù)加油.

c++ 的文章可以寫許多,c11還有好多東西,其實我想寫java了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容