只是一篇超詳細的c++ list用法總結罷了

1.簡介

list是一個線性雙向鏈表結構,它的數據由若干個節點構成,每一個節點都包括一個信息塊(即實際存儲的數據)、一個前驅指針和一個後驅指針。使用時需要包含頭文件<list>。

         

它無需分配指定的內存大小且可以任意伸縮,這是因爲它存儲在非連續的內存空間中,並且由指針將有序的元素鏈接起來。由於其結構的原因,list 隨機檢索的性能非常的不好,因爲它不像vector 那樣直接找到元素的地址,而是要從頭一個一個的順序查找,這樣目標元素越靠後,它的檢索時間就越長。檢索時間與目標元素的位置成正比。雖然隨機檢索的速度不夠快,但是它可以迅速地在任何節點進行插入和刪除操作。因爲list 的每個節點保存着它在鏈表中的位置,插入或刪除一個元素僅對最多三個元素有所影響,不像vector 會對操作點之後的所有元素的存儲地址都有所影響,這一點是vector 不可比擬的。

2.構造

#include <iostream>
#include <list>

int main ()
{
  // 下面介紹幾種list的構造方法:
  std::list<int> first;                                // 空鏈表
  std::list<int> second (4,100);                       // 初始化4個值爲1的的元素
  std::list<int> third (second.begin(),second.end());  // 通過迭代器範圍初始化
  std::list<int> fourth (third);                       // 通過另一個list初始化

  // 也能通過數組進行初始化:
  int myints[] = {16,2,77,29};
  std::list<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );

  std::cout << "The contents of fifth are: ";
  for (std::list<int>::iterator it = fifth.begin(); it != fifth.end(); it++)
    std::cout << *it << ' ';

  std::cout << '\n';

  return 0;
}

運行結果:
The contents of fifth are: 16 2 77 29  

3.成員函數

3.1迭代器:

begin() 指向第一個元素位置
end() 指向最後一個元素後一個位置
rbegin() 指向第一個元素之前一個位置
rend() 指向最後一個元素位置

3.2容量相關:

size() 返回容器大小
max_size() 返回容器最大容量
empty() 判斷容器是否爲空
resize() 調整容量大小,多則刪少則補

3.3成員訪問:

不支持隨機訪問,其迭代器只有++,--操作,沒有+1,-1操作。

front()  返回第一個元素
back()  返回最後一個元素

 

 

 3.4元素調整:

assign(4,5) 對list重新賦值,4個5
assign(a.begin(),a.end()) 使用[a.begin(),a.end())範圍的元素對list重新賦值
emplace_front () 向list前端插入元素(c++11新特性,效率比push_front高)
push_front() 向list前端插入元素
pop_front() 刪除list第一個元素
emplace_back () 向list末尾插入元素(c++11新特性,效率比push_back高)
push_back() 向list末尾插入元素
pop_back() 刪除list末尾元素
insert (iterator position, const value_type& val); 向position位置插入元素val
insert (iterator position, size_type n, const value_type& val); 向position位置插入n個val
insert (iterator position, InputIterator first, InputIterator last); 在position位置插入[first,last)範圍的元素
emplace() 同insert在position位置插入val的方法(c++11,效率比insert高)
erase() 刪除指定位置元素:erase (iterator position); 刪除位置範圍元素:erase (iterator first, iterator last);
swap() 交換兩個list:list1.swap(list2)
clear() 清空list

3.5相關操作:

sort() 排序,默認從小到大
reverse() 前後反轉元素
remove() 刪除所有指定值的元素,remove(val):刪除list中所有值爲val的元素
splice() 功能有點類似insert,但是插入後原來的list被清空(因爲是直接將list2接入list1中)
merge() 將兩個list按大小順序合併,如果沒有順序需指定排序函數

下面看一下splice的使用例子: 

#include <iostream>
#include <list>

int main ()
{
  std::list<int> mylist1, mylist2;
  std::list<int>::iterator it;

  // 設置一些初始值:
  for (int i=1; i<=4; ++i)
     mylist1.push_back(i);      // mylist1: 1 2 3 4

  for (int i=1; i<=3; ++i)
     mylist2.push_back(i*10);   // mylist2: 10 20 30

  it = mylist1.begin();
  ++it;                         // points to 2

  mylist1.splice (it, mylist2); // mylist1: 1 10 20 30 2 3 4
                                // mylist2 (empty)
                                // "it" still points to 2 (the 5th element)
                                          
  mylist2.splice (mylist2.begin(),mylist1, it);
                                // mylist1: 1 10 20 30 3 4
                                // mylist2: 2
                                // "it" is now invalid.
  it = mylist1.begin();
  std::advance(it,3);           // "it" points now to 30

  mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
                                // mylist1: 30 3 4 1 10 20

  std::cout << "mylist1 contains:";
  for (it=mylist1.begin(); it!=mylist1.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  std::cout << "mylist2 contains:";
  for (it=mylist2.begin(); it!=mylist2.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

 

4.非成員函數

1.swap(list1,list2),交換兩個list,STL通用算法

2.重載了==,!=,<,>,<=,>= 比較運算符
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章