[英]Questions about std::list C++
我是整個Stl業務的新手,我有一個問題。 在使用stl之前,我的列表節點將是這樣的:
Class node
{
int duration;
string name;
node * next;
node * previous;
};
所以我的問題是,當我要使用stl時,我是否需要node * next
和node * previous
否則它們完全沒有用,因為std :: list用它們自己的next和previous函數來補償它們?
還有一個問題,你們喜歡使用std :: list還是自己制作? 因為這將是我第一次使用std :: list和Im,我對此感到非常困惑。
謝謝你的時間。
不,您不需要next
和previous
, std::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
元素不需要具有next
和previous
成員。 std::list
內部負責此類記賬。
通常,除非我對標准容器確實不能滿足某些特殊要求,否則我將使用標准容器而不是自己動手使用。 如果std::list
是最合適的-通常不是,但是有時-我使用它。
盡管嘗試創建自己的容器有一定的學習價值,但從長遠來看,這種事情是無濟於事的。 標准容器(假設實施質量很高)比大多數人自己能做的更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.