簡體   English   中英

FIFO實現

[英]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是一個更復雜的數據結構,由巧妙管理的動態數組塊組成。 它最終比鏈表更好,因為:

  1. 使用鏈表,每次插入意味着您必須進行昂貴的動態內存分配。 對於動態數組,您不需要。 只有在緩沖區必須增長時才分配內存。
  2. 數組元素是連續的,這意味着元素訪問可以很容易地在硬件中緩存。

您可以使用現有的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::liststd::dequestd::vector都可以用於此目的,但也提供其他功能。

暫無
暫無

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

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