मुझे आज यह सरल कोड मिला।
#include <iostream>
#include <string>
#include <string_view>
#include <unordered_map>
#include <vector>
int main(int argc, char* argv[]) {
std::unordered_map<std::string, int> m = {
{"asdf", 123},
{"dsdfesjfdaslkfjasljlasfjlasjfakdlsfjasklfajsklfjaskljlf", 123},
{"ldfjaslk}sfjalskdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj", 1},
{"ldafjaslk}sfjalskdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj", 1},
{"ldjaksdfjfjaslk}sfjalskdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj", 1},
{"ldfjaslk}sfdasfdsfjalskdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj", 1},
{"ldfjaslk}sfjalsksfdasdfdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj", 1},
{"ldfjaslk}sfjalskdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj", 1},
};
std::vector<std::pair<std::string_view, int>> vec;
for (auto& [s, i] : m) {
vec.push_back(std::make_pair(s, i));
std::cout << vec.back().first << std::endl;
}
}
मूल रूप से, वेक्टर मानचित्र के तत्व के साथ बनाया गया है। बात यह है कि वेक्टर में डालने पर यह स्ट्रिंग को string_view में परिवर्तित कर देता है। मैंने सोचा कि यह ठीक रहेगा क्योंकि हम string_view बनाने के लिए कॉन्स्ट स्ट्रिंग संदर्भ का उपयोग कर रहे हैं, और स्ट्रिंग वेक्टर के पूरे जीवनकाल में उपलब्ध होगी।
लेकिन जब मैंने आउटपुट की जाँच की, तो यह प्रतीत होता है कि दूषित डेटा दिखा।
�/�U.�Usfdasdfdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj
�/�U.�Usfjalskdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj
@/�U.�Ukdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj
�/�U.�Usfjalskdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj
@/�U.�Udfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj
.�Usljlasfjlasjfakdlsfjasklfajsklfjaskljlf
asdf
मुझे लगता है कि वेक्टर में string_view अब उचित तत्व को इंगित नहीं करता है। लेकिन ऐसा क्यों हुआ है? मुझे लगता है कि unordered_map पुनरावृत्ति करते समय अपरिवर्तनीय होगा, इसलिए मुख्य तत्व का पता नहीं बदला होगा।
गॉडबोल्ट लिंक : https://godbolt.org/z/dePdv5
1 उत्तर
make_pair
का उपयोग करके आप std::pair<std::string, int>
प्रकार की एक अस्थायी वस्तु उत्पन्न करते हैं। मैं एक त्रुटि फेंकने के लिए std::pair<std::string_view, int>
में रूपांतरण की अपेक्षा करता हूं, लेकिन स्पष्ट रूप से यह काम करता है।
किसी भी तरह, std::string_view
गैर-स्वामित्व वाला है, इसलिए जैसे ही अस्थायी वस्तु नष्ट हो जाती है (पंक्ति ;
के अंत में) यह लटकती हो जाती है।
आपको नई जोड़ी नहीं बनानी चाहिए। emplace_back
कुंजी और मान के साथ प्रयास करें।
std::string
से std::string_view
एक अंतर्निहित रूपांतरण है। आप देखते हैं कि लोग उस निर्णय के बारे में "परेशान" क्यों थे।
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।
std::make_pair
स्ट्रिंग की प्रतिलिपि नहीं बनाएंगे, और फिर vec प्रतिलिपि के संदर्भ को संग्रहीत नहीं करेंगे?vec.push_back(std::make_pair(std::string_view(s), i));
पर ठीक किया, तो इसने इसे ठीक कर दिया। लेकिन मुझे आश्चर्य है कि यह एक डिफ़ॉल्ट व्यवहार कैसे नहीं होगा?emplace_back
के साथ औरmake_pair
के बिना बेहतर काम करता है: लाइव कोलिरू पर डेमो ;-)