C++ Boost Foreach超詳細分析講解
一、說明
Boost.Foreach
Boost.Foreach 提供瞭一個宏來模擬 C++11 中基於范圍的 for 循環。您可以使用在 boost/foreach.hpp 中定義的宏 BOOST_FOREACH 來迭代序列而不使用迭代器。如果你的開發環境支持C++11,可以忽略Boost.Foreach。
二、示例代碼
2.1 最簡單的代碼
#include <string> #include <iostream> #include <boost/foreach.hpp> int main() { std::string hello("Hello, world!"); BOOST_FOREACH(char ch, hello) { std::cout << ch; } return 0; }
運算結果:
2.2 使用BOOST_FOREACH與BOOST_REVERSE_FOREACH
#include <boost/foreach.hpp> #include <array> #include <iostream> int main() { std::array<int, 4> a{{0, 1, 2, 3}}; BOOST_FOREACH(int &i, a) i *= i; BOOST_REVERSE_FOREACH(int i, a) { std::cout << i << '\n'; } }
運算結果:
BOOST_FOREACH 需要兩個參數。第一個參數是一個變量或引用,第二個是一個序列。第一個參數的類型需要與序列中元素的類型相匹配。
任何提供迭代器的東西,比如標準庫中的容器,都被歸類為一個序列。 Boost.Foreach 使用 Boost.Range 而不是直接訪問成員函數 begin() 和 end()。然而,因為 Boost.Range 是基於迭代器的,任何提供迭代器的東西都與 BOOST_FOREACH 兼容。
示例 52.1 使用 BOOST_FOREACH 迭代 std::array 類型的數組。傳遞的第一個參數是一個引用,這樣您就可以讀取和修改數組中的元素。在示例 52.1 中,第一個循環將每個數字與自身相乘。
第二個循環使用宏 BOOST_REVERSE_FOREACH,它的工作原理與 BOOST_FOREACH 相同,但在一個序列上向後迭代。該循環按順序將數字 9、4、1 和 0 寫入標準輸出流。
和往常一樣,如果塊隻包含一個語句,則大括號可以省略。
請註意,您不應使用使循環內的迭代器無效的操作。例如,在向量上迭代時不應添加或刪除元素。 BOOST_FOREACH 和 BOOST_REVERSE_FOREACH 要求迭代器在整個迭代過程中有效。
三、BOOST_FOREACH特點和應用范圍
和傳統的for或者std::for_each()算法比起來,BOOST_FOREACH顯得更加優雅而簡潔。
BOOST_FOREACH支持遍歷所有被Boost.Range識別為序列類型的對象,通常包括如下幾種:
- STL容器
- 數組
- 字符串strings
如下是幾個常見的例子:
1. 用BOOST_FOREACH遍歷STL容器
2. 使用引用類型獲取更高效的遍歷
std::list<int> list_int( /*...*/ ); BOOST_FOREACH( int i, list_int ) { // do something with i }
std::vector<std::vector<int> > matrix_int;
BOOST_FOREACH( std::vector<int> & row, matrix_int )
BOOST_FOREACH( int & i, row )
++i;
四、遍歷循環控制
使用break, continue,及return實現遍歷循環的控制
std::deque<int> deque_int( /*...*/ ); int i = 0; BOOST_FOREACH( i, deque_int ) { if( i == 0 ) return; if( i == 1 ) continue; if( i == 2 ) break; }
此外,還一個小訣竅就是通過define將BOOST_FOREACH定義為更優雅的方式:
#define foreach BOOST_FOREACH
BOOST_FOREACH並不復雜,有興趣的朋友可以看看,相信對提高大傢的編程能力還是很有幫助的。
到此這篇關於C++ Boost Foreach超詳細分析講解的文章就介紹到這瞭,更多相關C++ Boost Foreach內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!