2009-04-27 20 views
44

के साथ BOOST_FOREACH का उपयोग करके मैं BOOST_FOREACH का उपयोग करके std :: मानचित्र पर पुन: प्रयास करना चाहता हूं और मानों को संपादित करना चाहता हूं। मैं इसे काफी नहीं मिल सकता।stOS :: map

typedef std::pair<int, int> IdSizePair_t; 
std::map<int,int> mmap;  
mmap[1] = 1; 
mmap[2] = 2; 
mmap[3] = 3; 
BOOST_FOREACH(IdSizePair_t i, mmap) 
    i.second++; 
// mmap should contain {2,3,4} here 

बेशक यह कुछ भी नहीं बदलेगा क्योंकि मैं संदर्भ द्वारा पुनरावृत्ति नहीं कर रहा हूं। इसलिए मैं (के रूप में बढ़ावा डॉक्स में उदाहरण के प्रति) के बजाय इस लाइन स्थानापन्न:

BOOST_FOREACH(IdSizePair_t &i, mmap) 

और मैं संकलक त्रुटि मिलती है:

error C2440: 'initializing' : 
cannot convert from 'std::pair<_Ty1,_Ty2>' to 'IdSizePair_t &' 
    with 
    [ 
     _Ty1=const int, 
     _Ty2=int 
    ] 

कोई सुझाव?

+0

क्या संकलक आप उपयोग कर रहे हैं? मैंने वीएस -2008 पर अपना कोड आजमाया और यह सही तरीके से काम किया। मैंने Hvint के [उत्तर] का परीक्षण किया (http://stackoverflow.com/questions/795443/using-boostforeach-with-stdmap/795482#795482) भी और यह काम किया। यदि यह मायने रखता है, तो मैं बढ़ावा 1.36 का उपयोग कर रहा हूं। –

+0

शायद आप भूल गए हैं? इसके बिना, यह दूसरी जोड़ी की प्रतिलिपि बनाता है, और स्थिरता तब कोई फर्क नहीं पड़ता। –

उत्तर

66

समस्या जोड़ी के पहले सदस्य के साथ है, जो const होना चाहिए। इस प्रयास करें:

typedef std::map<int, int> map_t; 
map_t mmap; 
BOOST_FOREACH(map_t::value_type &i, mmap) 
    i.second++; 
+0

+1। आप मुझे कुछ सेकंड से हराया: डी –

+0

धन्यवाद, hvint। उसने ऐसा किया इसके अलावा (आपकी टिप्पणी पढ़ने के बाद) मुझे एहसास हुआ कि इसे ठीक करने का एक और तरीका है मेरे मूल कोड की पहली पंक्ति को इस पर बदलना: टाइपपीफ std :: जोड़ी IdSizePair_ty; (जो मुझे संदर्भ द्वारा पुनरावृत्त करने की इजाजत देता है) – kmote

+0

किमीोट, हां, वास्तव में मैंने अपने उत्तर में प्रस्तावित किया है (जिसे मैंने हटा दिया था जब मैंने देखा था)। साथ ही, क्या आप जानते हैं कि यह इस तरह से क्यों व्यवहार करता है? यदि आपको कुछ स्पष्टीकरण की आवश्यकता है तो मैं अपना मिटा दूंगा। –

4

एक अन्य विकल्प BOOST_FOREACH_PAIR उपयोग करने के लिए है, यहाँ मेरा उत्तर देखें:

BOOST_FOREACH & templates without typedef

+1

मुझे BOOST_FOREACH_PAIR का रूप पसंद है, लेकिन मुझे इसके लिए कोई आधिकारिक संदर्भ नहीं दिख रहा है और यह 1.46 संस्करण में नहीं है जिसका उपयोग मैं कर रहा हूं।क्या इसे कभी आधिकारिक रिलीज में शामिल किया गया था? –

+0

वह सिर्फ एक घर का बना मैक्रो था - इसे कभी भी बढ़ावा देने के लिए लागू नहीं किया गया था। Https://svn.boost.org/trac/boost/ticket/3469 – baderous

21

यह एक पुरानी धागा है, लेकिन वहाँ एक और अधिक सुविधाजनक समाधान है।

बूस्ट में 'रेंज एडेप्टर' की धारणा है जो इटरेटर श्रेणियों में परिवर्तन करती है। इस सटीक उपयोग के मामले के लिए विशिष्ट श्रेणी एडेप्टर हैं (नक्शा कुंजी या मानों पर पुनरावृत्ति): boost::adaptors::map_values और boost::adaptors::map_keys

तो आप इस तरह के नक्शे मूल्यों पर पुनरावृति सकता है:

BOOST_FOREACH(int& size, mmap | boost::adaptors::map_values) 
{ 
    ++size; 
} 

अधिक जानकारी here

+0

में इस समाधान के लिए ' 'शामिल करने की जरूरत है। – scai

0

सी ++ 11 के रूप में स्वत: कीवर्ड का उपयोग करने पर विचार करें:

std::map<int,int> mmap;  
mmap[1] = 1; 
mmap[2] = 2; 
mmap[3] = 3; 

BOOST_FOREACH(auto& mpair, mmap) 
    mpair.second++; 

//mmap will contain {2,3,4} here 
संबंधित मुद्दे