簡體   English   中英

關於std :: list C ++的問題

[英]Questions about std::list C++

我是整個Stl業務的新手,我有一個問題。 在使用stl之前,我的列表節點將是這樣的:

Class node
{
    int duration;
    string name;
    node * next;
    node * previous;
};

所以我的問題是,當我要使用stl時,我是否需要node * nextnode * previous否則它們完全沒有用,因為std :: list用它們自己的next和previous函數來補償它們?

還有一個問題,你們喜歡使用std :: list還是自己制作? 因為這將是我第一次使用std :: list和Im,我對此感到非常困惑。

謝謝你的時間。

不,您不需要nextpreviousstd::list內部實現了整個鏈表機制。 只是:

Class node {
  int duration;
  string name;
};

並將您的列表定義為:

std::list<node> myList;

甚至最好使用std::vector而不是std::list ,因為它在大多數情況下都優於std::list因為它使緩存更加友好。

std::vector<node> myVec;

另一種選擇是使用std::pair而不是定義自己的struct

std::list<std::pair<int, std::string>> myList;

但是,這里使用std::pair很明顯是主觀的。 我發現使用std::pair而不是使用兩個成員變量定義struct更方便,因為我可以在定義的位置看到STL數據結構的元素類型。

正如101010所說的那樣。 還請記住,stl list的性能很好,因為用於它們的分配器針對內存管理進行了優化。

經典的“節點添加”例程通常實現為單個分配(使用new(C ++)或malloc(C))。 不過,您可以通過靜態數組或將數據放在矢量上並指向它們來改善此問題。 我只是在告訴您是否要構建自己的東西並比較性能。

另外請注意,您正在使用雙向鏈接列表。 在許多情況下,每個塊僅需要一個迭代器,而stl具有forward_list容器。

不,您的std::list元素不需要具有nextprevious成員。 std::list內部負責此類記賬。

通常,除非我對標准容器確實不能滿足某些特殊要求,否則我將使用標准容器而不是自己動手使用。 如果std::list是最合適的-通常不是,但是有時-我使用它。

盡管嘗試創建自己的容器有一定的學習價值,但從長遠來看,這種事情是無濟於事的。 標准容器(假設實施質量很高)比大多數人自己能做的更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM