2013-02-21 139 views
11

我想徵求關於BOOST_FOREACH使用的建議。BOOST_FOREACH與for循環

我已經讀過它並不是真的建議在性能是一個非常沉重的頭。

此外,它強制使用「break」和「continue」語句,因爲你不能真正擁有由布爾驅動的退出條件,並且我總是被告知應該避免「break」和「continue」如果可能。

當然,優點是你不直接處理迭代器,它可以緩解遍歷容器的任務。

您對此有何看法? 您是否認爲如果使用它應該被系統地採用來保證項目中的同質性或者僅在某些情況下推薦使用它?

+4

「我總是被告知應儘可能避免」休息「和」繼續「。」你能精心準備嗎? – utnapistim 2013-02-21 10:49:52

+8

IIRC有理由避免中斷,並且在人們沒有RAII模式的好時代繼續回來,並且當循環會變得太「跳躍」時optmimizer可能會出現問題。那些是「單一進入單一退出」教條的日子,其中函數只有一個返回語句,多個if和一些goto。還有一些人在以前學過這些教條,從來沒有質疑過他們,並且在他們沒有任何意義但很麻煩的時候將它們傳播給年輕人。 – 2013-02-21 11:07:29

+0

雖然我同意你的看法,但我必須說,在循環中不使用break或continue可能是有價值的。 如果您在while循環中保留這些關鍵字並同意不將它們用於for循環,則意圖會變得更清晰。但這只是太多恕我直言,我不會建議。 – MatiasFG 2014-12-10 12:58:58

回答

18

我會說基於C++範圍的循環取代它。這是this BOOST_FOREACH example等價物:

std::string hello("Hello, world!"); 
for (auto c : hello) 
{ 
    std::cout << c; 
} 

我從來沒有發現我需要在使用它++ 03。

注意使用了昂貴的複製元素,或在一般上下文容器的範圍內基於循環時,最好使用const&這些要素:

SomeContainerType<SomeType> v = ....; 
for (const auto& elem : v) 
{ 
    std::cout << elem << " "; 
} 

同樣,如果您斯內德修改容器的元素,使用非const &(auto& elem : v)。

+0

我認爲你應該使用[const] auto&大部分時間 - 否則你會得到一個副本 – Daniel 2013-02-21 11:41:35

+0

更詳細的描述:http://msdn.microsoft.com/en-us/library/vstudio/dd293667.aspx(References and cv - 限定符) – Daniel 2013-02-21 11:47:31

+0

@Daniel是的,但在他的情況下,我們有單個'char's,並且我正在嘗試寫入'BOOST_FOREACH'示例的等價物。 – juanchopanza 2013-02-21 11:58:49

7

在編程中,清晰度是王道。我一直在C++ 03中使用boost foreach,發現它比手寫循環更可讀,頭文件的大小不會讓你失望。正如@juanchopanza正確指出的,當然,這個問題在C++ 11中已經過時了。

你對打破和繼續的關注是毫無根據的,可能適得其反。使用C++ 03的傳統長循環頭文件,人們傾向於而不是讀取循環頭並忽略隱藏在循環頭中的任何條件變量。更好地讓你的意圖明確,並繼續。

如果您已決定使用boost foreach,請系統使用它。畢竟,它應該被用來取代麪包和黃油的循環。

0

我剛剛用一個簡單的for循環替換了BOOST_FOREACH的一個用法,得到了50%的加速,所以我會說這肯定不總是最好用的。 你也不會得到有時你真正需要的循環計數器(例如「我」)。就我個人而言,如果它更適合你的風格,我不是粉絲,而是YMMV。

順便說一句 - 「沉重的標題」不會​​影響程序的性能,只會影響編譯時間。