2012-05-09 16 views
19

BOOST_FOREACH'un bu örnekte "saf" C++ 11 eşdeğeriyle değiştirilmesi mümkün mü?BOOST_FOREACH "pure" C++ 11 alternatifi ile değiştirilsin mi?

#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 ve v referanslar anahtar/değer çifti tutulması olan önemli bir özelliği.

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

ve

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

Ama değişmekteydi döngü fikirler için esaslı görünüyordu hiçbiri işe:

denedim. Tahminen döngü temelinde çok beri : önce bir deklarasyon olması gerekir değişmekteydi:

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

geçerli değil. Bulabileceğim

yakın eşdeğerdir: BOOST_FOREACH sürümü olarak oldukça özlü değildir

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

!

C++ 11'de aynı şeyi hızlı bir şekilde ifade etmenin bir yolu var mı?

+6

ilk örnekte her değişiklikte bir dize kopyalama muyuz makro Boost ile aynı çıktıyı üretir? Onu cidden istiyor musun? – pmr

cevap

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

Bu

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