//Inside the header.h
class telefonbok{
std::map<std::string,std::string> telebok;
std::map<std::string,std::string> aliasbok;
}
//Inside the cpp file
void telefonbok::alias(string name, string alias){
if (telebok.find(name) == telebok.end()) {
cout << "Not found" << endl;
} else {
//pointer = Adress stored in pointer.
//*pointer = Value of *pointer
string *pointer;
pointer = &telebok.find(name)->second;
aliasbok.insert(make_pair(alias, *pointer));
cout << *pointer << endl;
}
जब मैं पहले नक्शे (टेलीबोक) में मूल्य बदलता हूं तो नक्शे में दूसरा मूल्य (अलियासबोक) वही रहता है (जिसे मान के रूप में सूचक माना जाता है)।
उदाहरण:
पीटर 123
जोड़ें लुकिंग पीटर:
पीटर: 123
उर्फ याचिकाकर्ता
लुकिंग पीट:
पीट: 123
पीटर 987
बदलें लुकिंग पीटर:
याचिकाकर्ता: 987
लुकिंग पीट:
पीट: 123
(पीट कभी नहीं बदलता है जो मुद्दा है, यह हमेशा के लिए एक ही मूल्य के रूप में माना जाता है)
3 जवाब
सबसे पहले आपका कोड अक्षम है (आप कॉल को दो बार पाते हैं, जो बहुत महंगा ऑपरेशन है), इसलिए आपको पुनरावृत्तियों के साथ काम करना चाहिए, न कि पॉइंटर्स और यह आपके मुद्दे को हल करने में भी मदद करेगा:
class telefonbok{
typedef std::map<std::string,std::string> Telebok;
typedef std::map<std::string,Telebok::const_iterator> Aliasbok;
Telebok telebok;
Aliasbok aliasbok;
};
void telefonbok::alias(string name, string alias)
{
Telebok::const_iterator f = telebok.find( name );
if( f == telebok.end() )
cout << "Not found" << endl;
else
aliasbok.insert( make_pair( alias, f );
}
अब आपके पास निम्नलिखित हैं:
- आप दो बार
std::map::find()
फोन नहीं करते हैं - उपनाम के माध्यम से आप न केवल संख्या बल्कि मूल नाम भी पा सकते हैं
अन्य कोड से मूल्यों को मुद्रित करने के लिए थोड़ा और अधिक जटिल:
for( Aliasbok::const_iterator it = aliasbok.begin(); it != aliasbok.end(); ++it )
cout << "alias " << it->first << " has number " << it->second->second << " original name " << it->second->first << endl;
या एक मूल्य खोजने के लिए:
Aliasbok::const_iterator it = aliasbok.find( "abcd" );
if( it != aliasbok.end() )
cout << "phone for " << it->first << " is " << it->second->second << endl;
else
cout << "phone for abcd not found" << endl;
लेकिन आपको पुनरावृत्तियों का उपयोग करते समय इसका उपयोग करना चाहिए
नोट: यदि आप फोनबुक से रिकॉर्ड हटाते हैं, तो आपको पहले अलियासबुक को साफ करना होगा, अन्यथा यह अमान्य पुनरावृत्तियों को पकड़ लेगा। उचित समाधान boost::multi_index
का उपयोग करना होगा, लेकिन यह शायद आपके स्तर के लिए भी जटिल है।
जब मैं पहले नक्शे (टेलीबोक) में मूल्य को बदल देता हूं तो नक्शे में दूसरा मान (अलियासोक) वही रहता है (वह जो सूचक को मान के रूप में माना जाता है)।
यदि aliasbok
को मान के रूप में सूचक माना जाता है, तो आपका बग यह है कि आपने मानचित्र को गलत तरीके से परिभाषित किया है। यहाँ आपकी परिभाषा है:
std::map<std::string,std::string> aliasbok;
ध्यान दें कि मानचित्र का मूल्य प्रकार std::string
कैसे है, जो एक मूल्य प्रकार है और std::string*
नहीं है जो कि एक सूचक प्रकार होगा।
इस लाइन पर भी ध्यान दें:
aliasbok.insert(make_pair(alias, *pointer));
जहां आप पॉइंटर को डिफाइन करते हैं और प्वॉइंट को कॉपी करने के बजाय पॉइंटेड स्ट्रिंग को पेयर में कॉपी करते हैं।
आपको साझा किए गए पॉइंटर्स को स्टोर करना होगा और उन्हें उसी स्ट्रिंग के लिए एपिनोटेटली सेट करना होगा।
class telefonbok{
std::map<std::string,std::shared_ptr<std::string>> telebok;
std::map<std::string,std::shared_ptr<std::string>> aliasbok;
}
और जरूरत के अनुसार संकेत को अद्यतन करने के तरीके प्रदान करते हैं जैसे कि
void addphone(std::string const & name,
std::string const & alias,
std::string const & phone);
{
std::shared_ptr<std::string> phone_ptr(new std::string(phone));
telefonbok.telebok.emplace(name,phone_ptr);
telefonbok.aliasbok.emplace(alias,phone_ptr);
}
और इस तरह जब आप फोन को संशोधित करते हैं, तो यह दोनों पर अपडेट हो जाएगा। जब आप फ़ंक्शन के दायरे से बाहर निकलेंगे तो आपका फ़ोन भी नहीं मरेगा।
फिर आप अपडेट के लिए ऐसा कर सकते हैं
void update_phone(std::string const & name,
std::string const & newphone)
{
if( auto iter = telefonbok.telebok.find(name) )
{
*(iter->second.get()) = newphone;
} else if ( auto iter = telefonbok.aliasbok.find(name) )
{
*(iter->second.get()) = newphone;
}
}
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।