2013-12-23 158 views
8

我想在我的項目中尋找代替std::vector,我發現std::queue是我正在尋找的。基於範圍的循環std ::隊列

我有很多功能,使用range-based loop迭代,我試圖儘可能保持它。

我嘗試編譯在std::queue一個range-based loop但我得到的編譯錯誤

error: no matching function for call to 'begin(std::queue&)'

std::queue支持範圍的基礎循環?

我確實嘗試過Google search,但沒有找到任何與此相關的話題。

更新:

我的編譯器是GCC v4.7.1

-std=c++11啓用

而這裏的錯誤的測試代碼:

std::queue<int> Q; 

for (int i = 0;i < 10; ++i) 
    Q.push(i); 

std::cout << "\nqueue contains: "; 
for (auto i : Q) 
    std::cout << i << ", "; 
+0

對於將來的問題,您可以嘗試在一個在線編譯環境(如[http://ideone.com](http://ideone.com))上構建測試用例,如果您有編譯器會立即通知您問題與否。在這裏,http://ideone.com/kIln7G它給出了你提到的同樣的錯誤 – nurettin

+0

@ mr5好吧,gcc 4.8.1和clang ++ 3.4都失敗了。 – Morwenn

+0

@Morwenn那麼這是一個無效的代碼? – mr5

回答

9

那麼,答案其實很簡單:中沒有功能,並且std::begin也沒有任何超載,要麼std::queue要麼。你可以看看documentation

核心問題是std::queue不意味着被迭代。它的存在是爲了滿足其他需求。如果你真的需要迭代它,你應該使用底層容器(默認std::deque),它支持迭代並且你的代碼將是有效的。

+0

我還在等待其他答案,但我認爲沒有比這更多不同的答案。如果它符合我的需要,我會尋找'std :: deque'。感謝您的解釋。 – mr5

+3

請注意,'std :: queue'只是一個適配器類,它將「push」和「pop」這兩個函數「添加」到合適的含義。你總是可以使用底層的'std :: deque',但是你沒有這些便利功能。但是你也可以聲明一個'std :: deque' *和*一個'std :: queue';使用'deque'進行迭代和'queue'方便地進行推送和彈出。 – leemes

+0

嚴格來說,它不會「添加」這兩個函數,它會用這兩個函數替換整個容器接口。 std :: queue'的目的很大程度上是爲了防止用戶以FIFO順序訪問底層容器。形式上的目的是實現一個簡單的抽象數據類型,但它相當於接口縮小。也就是說,存在'queue'的原因是爲了防止用戶迭代它。如果你想使用'deque'作爲FIFO,除了其他用途,你只需要將這些函數命名爲'push_back'和'pop_front'。 –