2008-09-26 20 views
6

में सभी मानों को सेट करना एक ही मूल्य पर std::map में सभी मानों को सेट करने के लिए, प्रत्येक मान पर एक लूप को पुन: उपयोग किए बिना?std :: map

+0

टोरस्टन, सी ++ एसटीएल 'मानचित्र' * हैश तालिका के रूप में लागू नहीं किया गया है। –

उत्तर

13

सी ++ में <algorithm> से विधि है लेकिन यह नक्शे के लिए काम नहीं करता है। वास्तव में, सहयोगी कंटेनर के लिए एल्गोरिदम समर्थन आम तौर पर अच्छा नहीं है।

नतीजतन, आप एक interation का उपयोग करें या एक उपयुक्त functor for_each साथ प्रयोग किया जा करने के लिए लिखने के लिए होगा (लेकिन मैं इस अनावश्यक भूमि के ऊपर करने पर विचार):

template <typename TKey, typename TValue> 
struct resetter : public std::unary_function<std::pair<TKey, TValue> > { 
    TValue const value; 

    public resetter(value const& v) : value(v) { } 

    public void operator()(std::pair<TKey, TValue>& v) { 
     v.second = value; 
    } 
}; 

for_each(map.begin(), map.end(), resetter<Key, Value>(value)); 
2

बढ़ावा :: असाइन पुस्तकालय एक कंटेनर की सामग्री शुरू करने में मदद करने के लिए सभी प्रकार की साफ चीजें हैं। मेरा विचार था कि इसका उपयोग नक्शा के माध्यम से स्पष्ट रूप से पुन: प्रयास करने से बचने के लिए किया जा सकता है। दुर्भाग्य से, नक्शे उत्सुक जानवरों को प्रारंभ करना मुश्किल है क्योंकि चाबियाँ अद्वितीय होनी चाहिए। निचली पंक्ति यह है कि लूप के लिए एक सरल नक्शा आरंभ करने का सबसे अच्छा तरीका है। यह बहुत ही सुरुचिपूर्ण नहीं हो सकता है, लेकिन यह काम पूरा हो जाता है और एसटीएल के साथ किसी भी परिचित व्यक्ति के द्वारा तत्काल समझ में आता है।

map <int,string> myMap; 
for(int k=0;k<1000;k++) 
    myMap.insert(pair<int,string>(k,string(""))); 

इस बाकी पोस्ट में मैंने उपर्युक्त निष्कर्ष तक पहुंचने के लिए यात्रा की व्याख्या की है।

बूस्ट :: असाइनमेंट मानचित्र पर कुछ छोटी संख्याओं को असाइन करना आसान बनाता है।

map<string,int> m; 
insert(m)("Bar", 1)("Foo", 2); 

या

map<int,int> next = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6); 

अपने मामले हैं, जहां आप एक ही मूल्य के साथ पूरे मानचित्र आरंभ करना चाहते हैं, वहाँ उपयोगिताओं दोहराने और repeat_fun हैं।
कुछ इस तरह कोनराड रूडोल्फ के रूप में एक मल्टीमैप (अपरीक्षित कोड स्निपेट) के साथ काम करना चाहिए

pair<int,string> init(0,string("")); 
multimap <int,string> myMap = repeat(1000,init); 

के रूप में बताया, तो आप एक ही सटीक मूल्य के साथ एक मानचित्र आरंभ नहीं कर सकता, क्योंकि चाबियाँ अद्वितीय होना चाहिए।

इससे जीवन अधिक जटिल (मजेदार?) बनाता है। कुछ इस तरह, शायद:

map <int,string> myMap; 

struct nextkey 
{ 
    int start; 
    nextkey(s) : start(s) {} 
    pair<int,string> operator()() 
{ 
    return pair<int,string>(start++,string("")); 
} 
}; 

myMap = repeat_fun(1000,nextkey(0)); 

अब, यह बहुत जटिल हो रही है, मैं अब लगता है कि एक सरल यात्रा

map <int,string> myMap; 
for(int k=0;k<1000;k++) 
    myMap.insert(pair<int,string>(k,string(""))); 
+0

आपका कोड स्निपेट एक साधारण मानचित्र में काम नहीं करेगा क्योंकि आप एक ही कुंजी फिर से डालेंगे। आपको इस मामले में जनरेटर फ़ंक्शन का उपयोग करना होगा। –

+0

अच्छा बिंदु! यह एक multimap होना होगा, या repeat_fun का उपयोग करना मुझे आश्चर्य है कि मूल सवाल क्या चाहता था? – ravenspoint

+0

हां बूस्ट :: असाइन करना नक्शे भरने का आपका सबसे आसान समाधान है। पूरी तरह से सहमत है, वाक्यविन्यास के अलावा लगभग स्क्रिप्ट चिकना है। –

3

मैं एक ही समस्या का सामना करना पड़ा लेकिन पाया गया कि सीमा लौटे जाने का रास्ता है बूस्ट :: एडाप्टर :: मूल्य परिवर्तनीय है, इसलिए इसका उपयोग सामान्य एल्गोरिदम जैसे std :: fill के साथ किया जा सकता है।

#include <boost/range/adaptor/map.hpp> 
auto my_values = boost::adaptors::values(my_map); 
std::fill(my_values.begin(), my_values.end(), 123); 
संबंधित मुद्दे