程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ 頭文件系列(forward_list)

C++ 頭文件系列(forward_list)

編輯:關於C++

C++ 頭文件系列(forward_list)。本站提示廣大學習愛好者:(C++ 頭文件系列(forward_list))文章只能為提供參考,不一定能成為您想要的結果。以下是C++ 頭文件系列(forward_list)正文


簡介

forwrad_list字面意思為前向列表,但實踐上它是一種單向列表,只能從單一方向遍歷。

單向鏈表完成

forward_list外部是用單向列表完成的,並且設計該庫的時分就是以近乎手寫的單向鏈表的運轉效率(時間上和空間上)為目的的。 這招致了它是獨一一個C++規范庫容器中沒有size成員函數的容器, 由於維護這樣一個信息會形成效率上的細微損失。

作為單向鏈表,它有以下幾個屬性:

  • 潛在能夠的非延續內存分配
  • 線性時間的元素地位獲取
  • 常數時間的元素拔出、刪除、挪動
與list的個性

由於它們的外部完成都是經過鏈表(不論是單鏈表還是雙鏈表),所以forwrd_list類模版具有一些與list相反的特殊函數:

  • splice_after
  • remove、remove_if
  • unique
  • merge
  • sort
  • reverse
與list的差別

分明的,forward_list是單向鏈表,外部只維護了單向遍歷的信息。 因而,forward_list的迭代器是前向迭代器(forward intertor)。

除此之外,它們的拔出操作也有分明的不同,詳細表現在傳入的迭代器上:

  • list::insert:在傳入的迭代器之前拔出。
  • forward_list::insert:在傳入的迭代器之後拔出。

我們來看,為什麼規范庫要保持接口語義的分歧性,采用不一樣的接口設計。

節點修正戰略 單向 VS 雙向

典型的鏈表分單向和雙向,根本上每一個方向上都需求額定的空間來保管順序信息(即前一個和後一個元素)。 雙向鏈表保管有兩個方向的鏈接, 而單向鏈表只要一個方向。

節點修正

當觸及到鏈表節點的修正時,例如拔出、挪動等,問題就變得分明了:關於鏈表來說,修正單個節點實踐上觸及到3個節點的信息----以後節點、前驅節點lis、後繼節點(修正前後節點的前後節點的鏈接信息是必要的)。

但是,可以更復雜點:雙向鏈表的前驅和後繼信息可以直接地經過以後節點失掉,由於以後節點有足夠的信息 。也就是說,在修正節點時,我只需傳入該節點就可以了;而單向鏈表單個節點可以經過鏈接信息取得後繼節點。

傳入前驅節點迭代器

實踐上,forward_list庫做得更好,它的相關接口只需求我們傳入一個節點迭代器。 這些接口包括(辨別對應罕見的非after版本):

  • insert_after
  • emplace_after
  • erase_after

那麼這怎樣做到的呢? forward_list的戰略是----傳入前驅節點的迭代器。 這樣一來,一切需求的節點信息都可以直接直接地失掉。 Great!

但是這也有一個問題:怎樣在頭部拔出一個元素呢?畢竟頭節點沒有前驅節點。 哈哈,這就是為什麼這個類模版提供了兩個十分奇異的函數, 它們是專門為上述三個函數提供服務的(-_-):

  • before_begin
  • before_cbegin

所以如今你也知道了,為什麼隨筆掃尾的表示圖有一個灰色的節點了吧。ヽ(^o^)ノ



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved