कारण यह कठिन बना क्योंकि यह खतरनाक है। आपको गारंटी है कि std::string
सदस्यों में से कोई भी कुंजी बंद नहीं होगा, कभी भी मूल्य नहीं बदलेगा, या पूरा नक्शा अवैध हो जाएगा। दिलचस्प, दिमाग में आने वाला पहला समाधान बेहद हैकिश दिखाई देता है, और यूबी की तरह दिखता है, लेकिन मेरा मानना है कि मैं बहुत सावधानी से यूबी को स्कर्ट करता हूं।
struct key_type {
mutable const char* ptr;
};
bool operator<(const key_type& lhs, const key_type& rhs)
{return strcmp(lhs.ptr, rhs.ptr)<0;}
struct person {
std::string name;
int age;
};
person& people_map_get(std::map<key_type, person>& map, const char* name) {
auto it = map.insert(name, person{name}).first; //grab, possibly insert
if->first.ptr = it->second.name.c_str(); //in case of insert, fix ptr
return it->second;
}
person& people_map_assign(std::map<key_type, person>& map, person p) {
auto pair = map.insert(name, p); //grab, possibly insert
auto it = pair.first;
if (pair.second == false)
it->second = std::move(p);
if->first.ptr = it->second.name.c_str(); //ptr probably invalidated, so update it
return it->second;
}
int main() {
std::map<key_type, person> people;
people_map_assign(people, person{"ted"});
person frank = people_map_get(people, "frank");
}
मुझे आशा है कि के रूप में स्पष्ट है, इस पागल यूबी के करीब है, और बहुत ज्यादा की सलाह नहीं दी। असल में, एक डालने/खोजने के दौरान, आपके अस्थायी ऑब्जेक्ट या इनपुट स्ट्रिंग पर मुख्य बिंदु, और जैसे ही ऑब्जेक्ट डाला/पाया जाता है, कुंजी स्ट्रिंग सदस्य में निहित मान पर इंगित होती है, और जब तक आप कभी भी ऐसा कुछ भी नहीं करते हैं जो किसी भी person
ऑब्जेक्ट पर .c_str()
के वापसी मूल्य को अमान्य कर देगा, सबकुछ बस मुश्किल से काम करता है। मुझे लगता है।
स्रोत
2013-08-28 20:12:51
'std :: set 'का उपयोग करने के बारे में, जहां' सी' 'टी' में संग्रहीत स्ट्रिंग की तुलना करता है? –
@Daniel: लेकिन फिर मुझे लुकअप के लिए एक संपूर्ण 'टी' ऑब्जेक्ट प्रदान करना होगा, न केवल 'std :: string', सही? या 'टी' से' टी' की तुलना करने के लिए 'सी' ओवरलोड किया जा सकता है और' t' से 'std :: string' तक भी? –
आह, मुझे लगता है कि सी ++ 14 किसी भी प्रकार की खोज करने के लिए एक टेम्पलेटेड 'ढूंढ' सदस्य जोड़ देगा जो 'टी'' की तुलना कर सकता है। –