[英]FIFO implementation
在實現FIFO時,我使用了以下結構:
struct Node
{
T info_;
Node* link_;
Node(T info, Node* link=0): info_(info), link_(link)
{}
};
我認為這是許多STL容器(例如List)的眾所周知的技巧。 這是一個好習慣嗎? 當你說Node有一個帶有類型指針的成員時,它對編譯器意味着什么? 這是一種無限循環嗎?
最后,如果這是一個不好的做法,我如何能夠實現更好的FIFO。
編輯:人們,這完全是關於實施。 我對STL庫非常熟悉,並且知道來自多個庫的大量容器。 我想與能夠提供良好實施或良好建議的人討論。
這是一個好習慣嗎?
我沒有看到任何特別的錯誤。
當你說Node有一個帶有類型指針的成員時,它對編譯器意味着什么?
存儲指向同一類對象的指針的類沒有任何問題。
最后,如果這是一個不好的做法,我如何能夠實現更好的FIFO。
我用std::queue
;)
顯然,您使用鏈接列表作為隊列的底層實現。 這沒什么特別糟糕的。
僅供參考,在實現方面,std :: queue本身使用std :: deque作為其底層實現。 std :: deque是一個更復雜的數據結構,由巧妙管理的動態數組塊組成。 它最終比鏈表更好,因為:
您可以使用現有的FIFO, std :: queue 。
這是實現節點的一種好方法。 節點指針用於創建指向容器中下一個節點的鏈接。 你是對的,它可以用來創建一個循環。 如果容器中的最后一個節點引用第一個節點,則迭代該容器將遍歷所有節點。
例如,如果容器是FIFO隊列,則指針將引用隊列中的下一個節點。 也就是說, link_
的值將是Node
類的另一個實例的地址。
如果值類型T
實現了昂貴的復制構造函數,則會有更高效的Node
類
struct Node
{
T * info_;
Node* link_;
Node(T * info, Node* link=0): info_(info), link_(link)
{}
};
請注意, info_
現在是指向T
實例的指針。 使用指針的想法是指定指針比復制復制對象便宜。
指向正在聲明的類型的對象的指針在C和C ++中都很好。 這是基於指針是固定大小的對象(例如,在32位平台上始終是32位整數)的事實,因此您不需要知道指向類型的完整大小。
實際上,您甚至不需要完整的類型聲明來聲明指針。 前瞻性聲明就足夠了:
class A; // forward declared type
struct B
{
A* pa; //< pointer to A - perfectly legal
};
當然,在實際訪問成員時,您需要在范圍內進行完整聲明:
#include <A.hpp> // bring in full declaration of class A
...
B b;
b.pa = &a; // address of some instance of A
...
b.pa->func(); // invoke A's member function - this needs full declaration
對於FIFO,請查看std::queue
。 std::list
, std::deque
和std::vector
都可以用於此目的,但也提供其他功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.