2012-01-22 24 views
5

मैं वैक्टर का एक नक्शा है कि इस तरह दिखता है बना लिया है विशेष कुंजी/मान (वेक्टर) बनने के बाद एक बार जोड़ने के लिए कहा वेक्टर तक पहुंचने का तरीका नहीं पता लगा सकता है। कोई सुझाव? मैं चारों ओर पुनरावृत्ति कर रहा हूं और वेक्टर के लिए बहुत कुछ जोड़ रहा हूं क्योंकि मैं जाता हूं इसलिए ऐसा करने का एक आसान तरीका अच्छा होगा। धन्यवाद।सी ++ नक्शा <स्ट्रिंग, वेक्टर <char>> पहुँच


मैं चाहता हूं कि मानचित्र में वेक्टर को जोड़ने के लिए जोड़ा जाए। मुझे मूल वेक्टर की आवश्यकता नहीं है ... मुझे केवल कुंजी/वेक्टर के मानचित्र को वापस करने की आवश्यकता है जिसे मैंने बनाया है (अपेंडिंग के बाद) ताकि मैं इसे किसी अन्य फ़ंक्शन में पास कर सकूं। * मानचित्र * * में क्या करता है? क्या यह एक सूचक को पुनर्जीवित कर रहा है? (मुझे अभी तक व्याख्यान में नहीं मिला है) इसके अलावा, मुझे इसकी आवश्यकता है: myMap [key] -> push_back ('s'); या myMap [key] .push_back ('s'); ??

+0

क्या आप हैश तालिका बनाने की कोशिश कर रहे हैं? –

+0

स्पष्ट होने के लिए - क्या आप 'myVector', या उस ऑब्जेक्ट की प्रतिलिपि में जोड़ना चाहते हैं जो मानचित्र में संग्रहीत है? मीर मिलद होसेनी ने जवाब दिया है कि आप 'myVector' में शामिल होने के लिए मानचित्र का उपयोग करना चाहते हैं, तो या तो वह उत्तर लागू है, या अन्य सभी हैं। –

उत्तर

7

संलग्न करने के लिए:

myMap[key].push_back('c'); 

या myMap.find उपयोग करें, लेकिन उसके बाद आप चाहे आप एक end इटरेटर प्राप्त की जांच करने के लिए है। operator[]vector का संदर्भ देता है।

लेकिन इस vector, नहीं मूल एक map में संग्रहीत को संशोधित करता है, जब से तुम myMap[key] = myVector; साथ map में एक प्रतिलिपि संग्रहीत किया है। यदि वह नहीं है जो आप चाहते हैं, तो आपको अपने डिजाइन पर पुनर्विचार करना चाहिए और शायद अपने मानचित्र में वैक्टरों को स्टोर (स्मार्ट) पॉइंटर्स स्टोर करना चाहिए।

+1

ऐसा करके, वेक्टर की एक प्रति बनाई गई है और क्लोन वेक्टर और मूल वेक्टर को धक्का दिया गया है। –

+0

@MirMiladHosseiny: ठीक है, अब मैं देख रहा हूं कि आपका क्या मतलब है, लेकिन मुझे लगता है कि ओपी मूल में बजाए मानचित्र में संग्रहीत वैक्टर का उपयोग करेगा। –

+0

क्या .... बकवास!'myMap [key]' मानचित्र में 'std :: vector ' के लिए एक लाभा है। अभिव्यक्ति 'myMap [key] .push_back (' c ');' बिल्कुल ठीक है और जाने का तरीका! (उत्तर पर +1)। –

1

मैप किए गए मान तक पहुंचने के लिए, जो आपके मामले में एक वेक्टर है, आप केवल मूल्य को असाइन करने के लिए स्क्वायर ब्रैकेट में कुंजी की आपूर्ति करते हैं। तो, 'एक' संलग्न करने के लिए:

myMap[key].push_back('a'); 
+0

ऐसा करके, वेक्टर की एक प्रति बनाई गई है और 'ए' क्लोन वेक्टर और मूल वेक्टर को धक्का दिया गया है। –

+0

नहीं 'myMap [key]' एक संदर्भ देता है, इसलिए यह मानचित्र के अंदर वेक्टर को संशोधित करता है। – Arpegius

+0

@ एलियनबेस्ट - ओपी का कहना है कि वह नक्शा में वेक्टर में 'चार' को जोड़ना चाहता है, इसलिए मुझे विश्वास है कि यह सही है। –

3

आप कुंजी पता देखते हुए:

string key = "something"; 
char ch = 'a'; // the character you want to append 

map<string, vector<char> >::iterator itr = myMap.find(key); 
if(itr != myMap.end()) 
{ 
    vector<char> &v = itr->second; 
    v.push_back(ch); 
} 

आप भी मानचित्र प्रविष्टि का उपयोग करने की map::operator[] इस्तेमाल कर सकते हैं, लेकिन अगर कुंजी मौजूद नहीं है, एक कि कुंजी के साथ नई प्रविष्टि बनाया जाएगा:

vector<char> &v = myMap[key]; // a map entry will be created if key does not exist 
v.push_back(ch); 

या बस:

myMap[key].push_back(ch); 
+0

यह 'वेक्टर और v' होना चाहिए। तो 'v.push_back (ch)' व्हाइटरेटर किस बिंदु पर काम करता है। – Arpegius

+0

@ मेयसैम: शेरबेस्ट सही है: यदि आप किसी अन्य नाम (जैसे 'v') द्वारा 'iter-> second' को संदर्भित करने का आग्रह करते हैं) तो आपको इसकी आवश्यकता है, ठीक है, इसका संदर्भ लें:' std :: vector और v = iter-> दूसरा ; '। –

+0

@ मेयसम: सबस्क्राइटर ऑपरेटर का उपयोग करते समय भी जब वे मौजूद नहीं होते हैं तो नए तत्व बना सकते हैं, फिर भी आपको एक संदर्भ का उपयोग करने की आवश्यकता है: अन्यथा आप एक प्रतिलिपि में शामिल होते हैं। –

0

मेरे पास एक नया सुझाव है। map में वैक्टरों के पॉइंटर को इकट्ठा करने के लिए आप के बजाय vector<char>* का उपयोग कर सकते हैं। अधिक जानकारी के लिए bellow कोड देखें:

map<string, vector<char>* > myMap; 
string key = "myKey"; 
vector<char>* myVector = new vector<char>(); 
myMap[key] = myVector; 
myMap[key]->push_back('S'); 
+3

पॉइंटर्स का उपयोग 'std :: vector 'को निश्चित रूप से स्मृति रिसाव बनाने से परे क्या होगा? –

संबंधित मुद्दे