2009-01-29 29 views
23

有誰知道爲什麼std :: queue,std :: stack和std :: priority_queue不提供clear()成員函數?我有一個假像這樣:爲什麼標準C++容器適配器不提供清晰的功能?

std::queue<int> q; 
// time passes... 
q = std::queue<int>(); // equivalent to clear() 

IIRC,clear()通過一切可以作爲底層的容器中。有沒有容器適配器提供它的一個很好的理由?

回答

18

嗯,我認爲這是因爲clear不被認爲是一個隊列,一個priority_queue或堆棧上的有效操作(順便說一句,deque不是,適配器,而是一個容器)。

使用容器 適配器隊列而不是容器 雙端隊列是要想清楚,你是 僅執行隊列操作的唯一原因,並沒有 等操作。 (from the sgi page on queue)

所以,當使用一個隊列時,你所能做的只是push/pop元素;清除隊列可被視爲違反FIFO概念。因此,如果你需要清除你的隊列,也許它不是一個真正的隊列,你應該更好地使用一個雙端隊列。

但是,這個事情的概念是有點狹隘的,我認爲清理隊列就像你做的那樣足夠公平。

-1

我認爲這取決於實現 - 直到最近Microsoft STL在幾個容器上都沒有清楚。 (它現在,例如this quick google result

但是,clear()通常只是一個調用來擦除(begin(),end()),所以實現自己的等價物並使用它。

我認爲這個標準指的是在迭代器範圍內清除擦除,所以上面是大多數實現將提供的內容。 (eg Dinkumware's

+3

stack,queue和priority_queue也沒有迭代器。 – Reunanen 2009-01-29 22:53:20

2

我想說這是因爲容器適配器不是容器。

-2

std :: queue,std :: deque和std :: priority_queue是容器適配器,只提供少量方法來訪問基礎容器。

只要您可以訪問它,您就可以清除底層容器。爲此,創建要傳遞給apadptor構造函數的底層容器。例如:

std::deque<int> d; 
std::queue<int> q(d); 

... time passes ... 

d.clear(); 

編輯:附加信息

我也要提醒你小心踏在這裏作爲調用底層容器上的方法可以打破由適配器作出的假設。在這方面,你目前清理隊列的方式似乎更可取。

+1

Daniel,這是不正確的,隊列的構造函數參數只用於_initializing_隊列,不用於傳遞對實際容器的引用。換句話說,'q'將用'd'內容初始化,但清除'd'不會影響'q'。 – codelogic 2009-01-29 23:33:40

+0

有趣 - 我看的構造函數沒有對集合採用const引用... – 2009-01-30 04:34:23

1

只要你從它繼承,你可以清除隊列(和std :: stack和priority_queue)。容器被有意保留以允許這樣做。

相關問題