2012-01-22 48 views
2

最好的方式,我有一個deque:什麼是訪問雙端隊列的元素在C++ STL

deque<char> My_Deque; 
My_Path.push_front('a'); 
My_Path.push_front('b'); 
My_Path.push_front('c'); 
My_Path.push_front('d'); 
My_Path.push_front('e'); 

有這樣的方式來輸出。

第一:

deque<char>::iterator It; 
for (It = My_Deque.begin(); It != My_Deque.end(); It++) 
    cout << *It << " "; 

第二:

for (i=0;i<My_Deque.size();i++) { 
    cout << My_Deque[i] << " "; 
} 

什麼是訪問雙端隊列的元素的最佳途徑 - 通過迭代器或類似這樣的:My_Deque[i]? has deque < ...>元素指向每個元素的指針數組,以便快速訪問其數據,或者以連續方式訪問其隨機元素(如下圖所示)? enter image description here

回答

3

STL deque通常實現爲固定大小數組的動態數組,因此索引訪問非常高效。

5

既然你問了「最好的辦法」:

for (char c : My_Deque) { std::cout << c << " "; } 
+0

你需要什麼樣的C++版本才能工作? – tjwrona1992

+0

@ tjwrona1992:C++ 11或更高版本。 –

+2

這太糟糕了,我的公司仍然生活在石器時代。哦,也許在幾年後他們終於升級了,我可以做出像這樣的漂亮乾淨的循環。 – tjwrona1992

1

既然你問了「最好的辦法」:

std::copy(My_Deque.begin(), My_Deque.end(), 
      std::ostream_iterator<char>(std::cout, " ")); 

不可否認,個別對象的格式不會使很大程度上的區別,但使用分段數據結構算法可以做出重大區別!在處理整個範圍時分段處理分段時可能會有一個有趣的優化。舉例來說,如果你有一個大std::deque<char>要逐字寫入文件,像

std::copy(deque.begin(), deque.end(), std::ostreambuf_iterator<char>(out)); 

這是從一個分段的數據結構複製到另一個分段的數據結構(在引擎蓋下的流緩存使用的緩衝區字符成爲它們的片段)可以花費相當少的時間(取決於數據可以寫入目的地的速度)。

+2

你的'std :: for_each'示例不會被編譯。該算法需要第三個參數的一元函數對象。 – Blastfurnace

+0

@Blastfurnace:這的確如此。不知何故,我太渴望與Kerrek SB的回答相匹配。我會解決這個問題:它應該讀取'std :: copy()'。謝謝! –

1

該標準規定deque應該在恆定時間內支持隨機訪問。所以是的,[i]應該是相當快的。

但是我認爲,使用迭代器仍然是一個優點。它可以(理論上至少)是一個更快的恆定倍數(或者可能更慢!)。無論如何,[i]的每次使用都將涉及查找一些表格並計算偏移量等。我認爲012quefor deque :: iterator稍微多於「找到我的偏移量;加1;使用新偏移量查找」