2012-05-09 8 views
19

क्या इस उदाहरण में BOOST_FOREACH को "शुद्ध" सी ++ 11 समकक्ष के साथ प्रतिस्थापित करना संभव है?BOOST_FOREACH को "शुद्ध" सी ++ 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; 
    } 
} 

प्रमुख विशेषता k और v के लिए संदर्भ में मुख्य/मान जोड़े रखने जा रहा है।

मैंने कोशिश की:

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

लेकिन के लेकर पाश विचारों के लिए आधारित लग रहा था कोई भी काम करने के लिए। मुमकिन है पाश के लिए आधारित लेकर, : से पहले एक घोषणा के लिए भी आवश्यक है के बाद से:

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 संस्करण के रूप में संक्षिप्त नहीं है!

क्या सी ++ 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; 
}