C ++ में, क्या संसाधनों को किसी नक्शे से चोरी करना ठीक है जिसे मुझे बाद में ज़रूरत नहीं है? दरअसल, मैं एक है मान std::map
के साथ std::string
कुंजी और मैं एक वेक्टर के संसाधनों चोरी से इसे से बाहर का निर्माण करना चाहते हैं map
का उपयोग कर रों चाबियाँ std::move
। ध्यान दें कि इस तरह की लिखने की पहुंच आंतरिक डेटास्ट्रक्चर (कुंजियों का क्रम) को दूषित करती है, map
लेकिन मैं बाद में इसका उपयोग नहीं करूंगा।
प्रश्न : क्या मैं इसे बिना किसी समस्या के कर सकता हूं या क्या इससे उदाहरण के लिए अप्रत्याशित कीड़े पैदा हो जाएंगे map
क्योंकि मैंने इसे इस तरह से एक्सेस किया है जो std::map
इसका उद्देश्य नहीं था?
यहाँ एक उदाहरण कार्यक्रम है:
#include<map>
#include<string>
#include<vector>
#include<iostream>
using namespace std;
int main(int argc, char *argv[])
{
std::vector<std::pair<std::string,double>> v;
{ // new scope to make clear that m is not needed
// after the resources were stolen
std::map<std::string,double> m;
m["aLongString"]=1.0;
m["anotherLongString"]=2.0;
//
// now steal resources
for (auto &p : m) {
// according to my IDE, p has type
// std::pair<const class std::__cxx11::basic_string<char>, double>&
cout<<"key before stealing: "<<p.first<<endl;
v.emplace_back(make_pair(std::move(const_cast<string&>(p.first)),p.second));
cout<<"key after stealing: "<<p.first<<endl;
}
}
// now use v
return 0;
}
यह उत्पादन का उत्पादन करता है:
key before stealing: aLongString
key after stealing:
key before stealing: anotherLongString
key after stealing:
संपादित करें: मैं एक बड़े मानचित्र की संपूर्ण सामग्री के लिए यह करना चाहूंगा और इस संसाधन चोरी से गतिशील आवंटन को बचा सकता हूं।
std::string
शॉर्ट-स्ट्रिंग अनुकूलन की है। मतलब यह है कि नकल करने और आगे बढ़ने पर कुछ गैर-तुच्छ तर्क हैं और न केवल सूचक विनिमय और इसके अलावा अधिकांश समय का अर्थ है नकल करना - ऐसा न हो कि आप लंबे समय तक तार के साथ व्यवहार करते हैं। सांख्यिकीय अंतर वैसे भी छोटा था और सामान्य तौर पर यह निश्चित रूप से निर्भर करता है कि किस प्रकार का स्ट्रिंग प्रसंस्करण किया जाता है।
const
मूल्य को संशोधित करना हमेशा यूबी होता है।