2009-11-11 68 views

回答

12

有一個問題,因爲它是一個宏,因此不能處理包含逗號的類型(預處理器不知道模板)。

您也可以在循環之前聲明該變量,請參閱documentation

std::map<int, double> my_map; 

//1) 
typedef std::pair<int, double> MyPair; 
BOOST_FOREACH(MyPair p, my_map) { ... } 

//2) 
std::pair<int, double> p; 
BOOST_FOREACH(p, my_map) { ... } 

編輯:

沒有與特別std::map進一步複雜化:在value_type不是std::pair<Key, Value>,但std::pair<const Key, Value>

因此,如果您使用的typedef去,更合適的方式(也是唯一的方式,如果你想使用foreach循環一個參考)是使用

typedef std::pair<const int, double> MyPair; 
//or 
typedef std::map<int, double>::value_type MyPair; 

BOOST_FOREACH(MyPair& ref, my_map) { ... } 

然而,韓元如果你想使用一個在循環之前聲明的變量,你就不會工作,因爲你以後不能指定std::pair<const int, double>實例(不能指定給const字段),在這種情況下,你只能使用pair<int, double>作爲提升的手動顯示。

+1

你或許應該作出這樣的:STD :: map :: value_type – 2009-11-11 08:59:01

+0

也在C++ 11中; BOOST_FOREACH(auto&ref,my_map){...} – 2011-11-11 10:11:24

8

如果你需要遍歷的地圖,最簡單的方法是使用元組,因爲得到正確的鍵入以typedef,很麻煩。下面是你如何使用元組:

std::map<int, double> my_map; 
int key; 
double value; 
BOOST_FOREACH(boost::tie(key, value), my_map) { ... } 

只是一個說明,逗號將在這裏工作,因爲括號放在鍵和值周圍。預處理器只能理解逗號和括號(並且c99也要求它理解引號)。所以,它不能解析std::pair<int, double>中的<>。但是,我們可以使用括號來幫助預處理器。例如,如果我們有一個返回一個被稱爲像這樣的集裝箱AA功能:

BOOST_FOREACH(int i, foo<int, int>()) { ... } //This won't compile 

因此,我們可以把括號圍繞一個表達式,它會幫助預處理器:

BOOST_FOREACH(int i, (foo<int, int>())) { ... } //This will compile 

然而,在地圖的情況下,我們不能在括號內放置括號(因爲它不是表達式)。所以這是行不通的:

BOOST_FOREACH((std::pair<int, double> p), my_map) { ... } //This won't work 

因爲它會被轉化成這樣的事情(std::pair<int, double> p) = *it,這當然是不正確的C++。但使用領帶將工作:

BOOST_FOREACH(tie(key, value), my_map) { ... } //This will work 

我們只需要聲明循環外的鍵和值(如上所示)。另外,它可以使循環具有更多有意義的名稱。您可以寫key而不是p.firstvalue而不是p.second

+0

鍵和值之間的逗號會混淆預處理器。 – Ferruccio 2012-01-14 11:17:48

+0

@Ferruccio鍵和值之間的逗號將不會混淆預處理器,因爲圍繞鍵和值的括號。此外,當我需要迭代地圖時,我一直在做這個。 – 2012-01-14 22:35:58

+0

我不知道你可以用預處理器做到這一點。 – Ferruccio 2012-01-15 12:02:41

2

這可能是如此簡單:

BOOST_FOREACH(auto& p, my_map) { ... } 

使用C++ 11的標準,汽車就像是在C#變種,它會做

BOOST_FOREACH(std::pair<int, double>& p, my_map) { ... }