[英]std::queue and std::deque cleanup
假設我們有一種情況需要 FIFO 數據結構。 例如,按照事件進來的順序消費一些事件。
此外,我們需要不時地清除整個隊列。
std::queue
似乎非常適合這樣做,但不幸的是它缺少用於清除容器的 function。
所以在這一點上,我們有兩種選擇:
std::queue
std::queue
的std::deque
std::deque
總的來說,我們收到的不是太少就是太多,從來都不是我們真正想要的。
這是讓我感到驚訝的事情,當我試圖提供與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 中:
std::queue
與std::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.