C++STL堆棧與FORWARD_LIST [英] C++ STL stack vs forward_list

查看:0
本文介紹了C++STL堆棧與FORWARD_LIST的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我有一個用例,其中我需要以不特定的順序存儲一定數量的uint16_t變量(盡管變量的實際類型并不相關)。我已決定求助于STL來尋找最符合我需要的容器。

容器中的對象可以從容器中取出以供使用,然后放回容器中。在某種程度上,機械師可能只有一盒螺絲刀,而不是把螺絲刀放在口袋里。容器不需要對存儲的對象執行任何分類,取出什么并不重要-唯一的要求是知道容器中是否還有任何東西。

我的眼睛轉向std::stackstd::forward_list。它們都提供O(1)插入(只需更改前端元素)和O(1)彈出操作(同樣,僅更改前端元素并返回前一個前端)。問題是--我不知道它們在概念上有什么不同。

我知道std::stack是一個僅包裝實際STL容器(默認情況下為std::deque)的適配器,因此它可能會有一些意外的開銷,具體取決于包裝的容器。

我傾向于使用std::forward_list,但我正在尋求同事的意見。如果你對這件事有什么想法,請與我們分享。

推薦答案

TLDR: 如果只需要添加/刪除最后一個元素,請使用向量或堆棧。這是最快的選項,并且開銷最低。

長版本:查找鏈表和動態數組的比較,例如:vector vs. list in STL

大部分討論都是關于std::List,但Forward_List也適用同樣的原則

關于管理費用和運營的簡短說明

矢量數據結構:

  • 1個動態分配的數組
  • 1個整數,表示使用的元素數
  • 1個整數,表示可用元素的數量(預分配的大小)

(腳注:實際上不是計數器,而是指針。讓我們不用擔心那個)。

將元素追加到向量的末尾:

  1. 檢查是否有可用的空間。如果不是,則重新分配當前大小兩倍的數組。由于向量增長到其大小的兩倍(指數增長),因此這種情況非常罕見,并且不會對性能產生太大影響。
  2. 將元素復制到數組中的索引
  3. 遞增計數器

從向量的末尾刪除元素:

  1. 減少計數器。就是這樣(除非你有析構函數)
內存開銷: 指針和計數器為24字節。8字節,用于數組的動態分配。最差情況為50%未使用的元素。

轉發列表數據結構:

  • 1指向第一個元素的指針
  • 1指向最后一個元素的指針
  • 在每個元素中,有一個指向下一個元素的指針

正向列表插入:

  1. 動態分配新元素(昂貴)
  2. 設置指針(廉價)

刪除第一個元素:

  1. 將指針從第一個元素更改為第二個元素
  2. 釋放元素(開銷)

動態分配的計算開銷比向量使用的任何計算開銷都高得多。

內存開銷:

  • 基本結構中兩個指針的16個字節
  • 每個元素8字節用于動態分配,8字節用于指向下一個元素的指針,6字節填充,因為分配器只能處理8字節的倍數

每使用2個字節的有效負載,與向量中2取2的最壞情況相比,有22個字節的開銷!

這篇關于C++STL堆棧與FORWARD_LIST的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!

查看全文
登錄 關閉
掃碼關注1秒登錄
發送“驗證碼”獲取 | 15天全站免登陸
全免费A级毛片免费看无码播放