簡體   English   中英

std::queue 和 std::deque 清理

[英]std::queue and std::deque cleanup

假設我們有一種情況需要 FIFO 數據結構。 例如,按照事件進來的順序消費一些事件。

此外,我們需要不時地清除整個隊列。

std::queue似乎非常適合這樣做,但不幸的是它缺少用於清除容器的 function。

所以在這一點上,我們有兩種選擇:

std::queue

  • 我們詢問了 STL 庫我們需要什么。 當然,STL 庫會給我們更多:它會給我們一個偽裝成std::queuestd::deque
  • 我們只得到了我們需要的一部分,即流行的前線和后推但沒有明確的
  • 我們將不得不以某種方式“模擬”清除,而沒有循環和彈出的幼稚方式

std::deque

  • 我們詢問了 STL 庫我們需要什么
  • 我們得到了我們要求的東西,但我們得到的太多了:我們還得到了前推和后推

總的來說,我們收到的不是太少就是太多,從來都不是我們真正想要的。

這是讓我感到驚訝的事情,當我試圖提供與std::queue一起使用的清晰功能時,它是我的 object 的成員 var

struct message
{
};
struct consumer
{
    std::queue<message> _pending;

    void clear_ver_1()
    {
       auto will_be_deleted_when_out_of_scope = std::move(_pending);
    }

    void clear_ver_2()
    {
        std::queue<message> will_be_deleted_when_out_of_scope;
        _pending.swap(will_be_deleted_when_out_of_scope);
    }
};

我已經閱讀了規范,但我不能確定clear_ver_1是否會將_pending保留在valid but unspecified的 state 中。 請參閱此處的字符串示例

我很驚訝規范對這個主題如此含糊。 我找錯地方了嗎?

謝謝你們!

更新

分配和清算之間似乎存在不可忽視的差異。 在內部,隊列和雙端隊列幾乎相同(一個正在使用另一個)

在此處輸入圖像描述

std::move的使用

std::move不應該以這種方式使用。 當您不再使用 object 時,您應該只使用std::move它移動到程序中的其他位置。 正如您所說,然后將其留在有效但未指定的 state 中

  • 有效,因為它完全可以安全銷毀;
  • 未指定,因為您不應再訪問該 object。

std::queuestd::deque

如果您只打算使用 FIFO 功能,我建議您使用std::queue 它確實清楚地表明您將使用std::deque作為 FIFO 數據結構——清晰是std::queue首先存在的唯一原因。

清除std::queue

您可以將它分配給一個空的std::queue ,或者像您所做的那樣,將它換成一個空的。

// ...

struct consumer
{
    std::queue<message> _pending;

    void clearQueue()
    {
        _pending = {};
    }
};

根據DevSolar的評論編輯

我們得到了我們要求的東西,但我們得到的太多了:我們還得到了前推和后推

你得到了你想要的,出dequeue是一種數據結構,允許在任一端點進行有效的插入和刪除。 它可能不是適合您的數據結構,但選擇它是您的錯。

我們將不得不以某種方式“模擬”清除,而沒有循環和彈出的幼稚方式

根據記錄,彈出在性能方面非常便宜,它只是減少了一個數字。 while 循環中的彈出轉換為遞減 integer 直到 0,除非你有很多數字,否則速度非常快。 事實上,它可能比分配 memory 快得多,這將我們帶到:

STL 清除這些集合類的方法是用一個空集合交換它們(這是你自己想出來的)或者直接重新分配它們(蘋果的答案)。 這兩者都將(可能,標准對這一點含糊不清)分配 memory,這是一個非常昂貴的線性操作。

您擁有完成它的所有部分,但我建議您分析一下,看看哪種方式對您來說真的很重要。 就我個人而言,我只是在一個循環中彈出隊列,它將分配的 memory 留在原地,以備下次我需要推送更多時使用,因此它可以節省潛在的多次分配和重新分配(與重置隊列相比),具體取決於你擁有的數據量。

要清除隊列,您也可以簡單地寫

_pending = {};

注意:第一種方法可能不起作用,不應依賴,因為移動形式 object 有效但未指定 state。

暫無
暫無

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

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