2012-05-09 39 views
19

是否有可能在本例中用「純」C++ 11等效替換BOOST_FOREACH用「純」C++ 11替代替換BOOST_FOREACH?

#include <map> 
#include <functional> 
#include <boost/foreach.hpp> 
#include <iostream> 

int main() { 
    std::map<int, std::string> map = {std::make_pair(1,"one"), std::make_pair(2,"two")}; 
    int k; 
    std::string v; 
    BOOST_FOREACH(std::tie(k, v), map) { 
    std::cout << "k=" << k << " - " << v << std::endl; 
    } 
} 

的關鍵特徵是保持在引用的鍵/值對來kv

我想:

for(std::tie(k,v) : map) 
{ 
    std::cout << "k=" << k << " - " << v << std::endl; 
} 

auto i = std::tie(k,v); 
for(i : map) 
{ 
    std::cout << "k=" << k << " - " << v << std::endl; 
} 

但沒有一個基於不等for循環的想法似乎工作。大概是基於不等的迴路需要:之前必須有一個聲明,因爲即使是:

std::vector<int> test; 
int i; 
for (i : test); 

無效。

我能找到的最接近的是:

for (auto it = map.begin(); it!=map.end() && (std::tie(k,v)=*it,1); ++it) 
{ 
    std::cout << "k=" << k << " - " << v << std::endl; 
} 

這並不像BOOST_FOREACH版本簡潔!

有沒有一種方法可以在C++ 11中簡潔地表達相同的東西?

+6

你不是在第一個例子複製在每個迭代上串一樣嗎?你真的想要嗎? – pmr

回答

24
for (auto & i : map) 
{ 
    std::tie(k,v) = i; 
    // your code here 
} 
3

這將產生輸出的升壓宏觀

for(auto const& k : map) { 
    std::cout << "k = " << k.first << " - " << k.second << std::endl; 
}