2012-05-09 12 views
19

この例のBOOST_FOREACHを「純粋な」C++ 11同等品に置き換えることはできますか?BOOST_FOREACHを "純粋な" C++ 11の代わりに置き換えますか?

#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); 

が有効ではありません。私は見つけることができます

最も近い同等です:BOOST_FOREACH版ほど簡潔ではありません

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

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; 
}