1. 程式人生 > >從新撿起c++,從stl開始(2)

從新撿起c++,從stl開始(2)

list:

list類似於連結串列,它的儲存空間不是連續的,但是可以快速的插入和刪除,但是隨機訪問比較慢。

assign() 給list賦值        back()返回最後一個元素          begin()返回指向第一個元素的迭代器

clear() 清空list              empty()如果list為空返回true     erase() 刪除一個元素 

insert() 插入一個元素   merge() 合併兩個list                  pop_back() 刪除最後一個元素

remove() 刪除元素        resize() 改變list的大小              reverse() 把list的元素倒轉

swap() 交換兩個list       unique() 刪除list中重複的元素

list是一種序列式容器。list容器的功能實際上和資料結構中的雙向連結串列是極其相似的,list中的資料元素是通過連結串列指標串連成邏輯意義上的線性表,就是list也具有連結串列的主要優點:在連結串列的任一位置進行元素的插入、刪除操作都是快速的。list的實現是這樣的(基本list):list的每個節點有三個域:前驅元素指標域、資料域和後繼元素指標域。前驅元素指標域儲存了前驅元素的首地址;資料域則是本節點的資料;後繼元素指標域則儲存了後繼元素的首地址。其實,list和環形連結串列也有相似的地方,即:頭節點的前驅元素指標域儲存的是連結串列中尾元素的首地址,list的尾節點的後繼元素指標域則儲存了頭節點的首地址,這樣,list實際上就構成了一個雙向迴圈鏈。由於list元素節點並不要求在一段連續的記憶體中,顯然在list中是不支援快速隨機存取的,因此對於迭代器,只能通過“++”或“--”操作將迭代器移動到後繼/前驅節點元素處。而不能對迭代器進行+n或-n的操作。

list<int> a{1,2,3,4,5}; //初始化為12345
list<int> a(n); //n個元素,初始化為0
list<int> a(n,m);
list<int> a(s.begin(), s.end());// s是別的列表
//begin()和end()就是迭代器

#inclde <iostream>
#include <list>
using namespace std;

int main()
{
    list<int> lst;
    list<int> lst_bak(2, 0);
    list<int>::iterator iter;//list迭代器
    
    lst.push_back(1);
    lst.push_back(2);
    lst.push_back(3);

    lst.merge(lst_bak); //合併
     
    for(iter = lst.begin(); iter != lst.end(); ++iter) 
    {
        cout << *iter << endl;
    }  
    return 0;
}

deque:

deque全稱:”double ended queue”,雙端佇列。在頭和尾插入元素很方便,在中間很費時。

deque是雙向開扣的連續線性空間,當deque的儲存不足時,向兩端動態擴充套件,不想vector那樣,重新申請記憶體,然後複製元素。

deque是一種優化了的對序列兩端元素進行新增和刪除操作的基本序列容器。由一些獨立的區塊組成,第一區塊朝某方向擴充套件,最後一個區塊朝另一方向擴充套件。多個連續的記憶體塊。並且在一個對映結構中儲存對這些塊以及順序的跟蹤。(vector是一個連續的記憶體塊)

deque<int> deq;
deque<int> deq(5);//大小為5,value預設為0
deque<int> deq(5, 2);
  1. deq[ ]:用來訪問雙向佇列中單個的元素。
  2. deq.front():返回第一個元素的引用。
  3. deq.push_front(x):把元素x插入到雙向佇列的頭部。 pop_front()刪除
  4. deq.push_back(x):把元素x插入到雙向佇列的尾部.   pop_back()刪除

deque和vector的一些區別:

1.兩端都可以快速插入和刪除元素。vector只能在尾端。

2.deque的元素存取和迭代操作會慢,內部結構會多一個間接過程。記憶體塊不連續。

3.迭代器是特殊的智慧指標,需要在不同區塊之間跳轉。

4.除了首尾插入和刪除元素,其它位置會使得deque的iterator失效。

5.可以在中間插入和刪除元素,但是效能不如list。

6.不可以通過capacity和reverse操作。vector可以。

  #include <iostream>
  #include <deque>
  #include <string>
  #include <iterator>
  using namespace std;
  
  int main()
  {
      deque<string> str;
  
      str.assign(4, string("deque"));//放入四個deque
      str.push_back("last");
      str.push_front("first");
                     
      copy(str.begin(), str.end(),
              ostream_iterator<string>(cout, " "));//輸出str的內容,以“ ”隔開
      cout << endl;
  
      for (int i = 0; i < str.size(); ++i)
          cout << "str[" << i << "] : " << str[i] << endl; 
      cout << endl;
  
      for (int i = 0; i < str.size(); ++i)
          cout << "str.at(" << i << ") : " << str.at(i) << endl; 
      cout << endl;
      return 0;
  }

result:
first deque deque deque deque last 

str[0] : first
str[1] : deque
str[2] : deque
str[3] : deque
str[4] : deque
str[5] : last

str.at(0) : first
str.at(1) : deque
str.at(2) : deque
str.at(3) : deque
str.at(4) : deque
str.at(5) : last