//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

(पीट कभी नहीं बदलता है जो मुद्दा है, यह हमेशा के लिए एक ही मूल्य के रूप में माना जाता है)

-2
Widdin 18 नवम्बर 2015, 17:27

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 का उपयोग करना होगा, लेकिन यह शायद आपके स्तर के लिए भी जटिल है।

0
Slava 19 नवम्बर 2015, 14:30

जब मैं पहले नक्शे (टेलीबोक) में मूल्य को बदल देता हूं तो नक्शे में दूसरा मान (अलियासोक) वही रहता है (वह जो सूचक को मान के रूप में माना जाता है)।

यदि aliasbok को मान के रूप में सूचक माना जाता है, तो आपका बग यह है कि आपने मानचित्र को गलत तरीके से परिभाषित किया है। यहाँ आपकी परिभाषा है:

std::map<std::string,std::string> aliasbok;

ध्यान दें कि मानचित्र का मूल्य प्रकार std::string कैसे है, जो एक मूल्य प्रकार है और std::string* नहीं है जो कि एक सूचक प्रकार होगा।

इस लाइन पर भी ध्यान दें:

aliasbok.insert(make_pair(alias, *pointer));

जहां आप पॉइंटर को डिफाइन करते हैं और प्वॉइंट को कॉपी करने के बजाय पॉइंटेड स्ट्रिंग को पेयर में कॉपी करते हैं।

0
eerorika 18 नवम्बर 2015, 15:05

आपको साझा किए गए पॉइंटर्स को स्टोर करना होगा और उन्हें उसी स्ट्रिंग के लिए एपिनोटेटली सेट करना होगा।

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;
  }
}
0
g24l 18 नवम्बर 2015, 17:24