मैं वर्तमान में एसटीएल सीख रहा हूं, और मैपिंग, फ़िल्टरिंग इत्यादि के विषय पर हूं। मैंने हाल ही में बहुत सी नई चीजें सीखी हैं जैसे लूप के लिए नया सी ++ 11 (ऑटो के साथ) I (थोड़े) चीजों के काम करने के तरीके को समझ में नहीं आता है , लेकिन मैं एक और वेक्टर (मैपिंग विषय) को भरने के लिए "ट्रांसफ़ॉर्म" फ़ंक्शन का उपयोग करना चाहता था। लेकिन जब मैं प्रोग्राम बनाता हूं और इसे चलाता हूं, तो यह मुझे एक त्रुटि देता है जो इस प्रकार है: "मूल्य-प्रारंभिक वेक्टर इटरेटर की तलाश नहीं कर सकता"
मुझे यकीन नहीं है कि इसका क्या मतलब है या क्या त्रुटि है, क्या आप लोग मुझे लूप अवधारणा को समझने में मदद कर सकते हैं और मैं यहां क्या गलत कर रहा हूं?
अनुलेख अंत में "ट्रांसफॉर्म" का ऑपरेटर ट्यूटोरियल में लैम्ब्डा चीज़ (जिसे मुझे अभी भी सीखना है और इसके बारे में कोई जानकारी नहीं है) के साथ किया गया था, मैंने एक फ़ंक्शन बनाने की कोशिश की और अनुमान लगाया कि यह काम करेगा।
int mult(int a) {
return a * 10;
}
int main() {
vector<int> v{ 1,2,3,4,5 };
vector<int> v1;
for (auto& i : v) {
cout << i << endl;
}
if (v1.empty()) cout << "v1 is empty" << endl;
cout << "v1" << endl;
transform(v.begin(), v.end(), v1.begin(), mult);
for (auto &i : v1) {
cout << i << endl;
}
}
2 जवाब
transform
एक सीमा का विस्तार नहीं करता है, यह केवल एक मौजूदा पर लिखता है जिसे गैर-रिक्त माना जाता है। v1
खाली है, इसलिए इसे परिवर्तन के परिणाम को संग्रहीत करने के लिए नहीं बनाया जा सकता है। आपके विकल्प यह सुनिश्चित करने के लिए हैं कि v1
में एल्गोरिथम को अधिलेखित करने के लिए पर्याप्त तत्व हैं:
vector<int> v1(v.size());
या आकार बढ़ाने वाला एक पुनरावर्तक बनाने के लिए std::back_inserter
का उपयोग करने के लिए v1
का:
transform(v.begin(), v.end(), back_inserter(v1), mult);
यह यूबी (अपरिभाषित व्यवहार) है, यह कुछ भी नहीं भरता है:
transform(v.begin(), v.end(), v1.begin(), mult);
तुम्हें चाहिए:
std::transform(v.begin(), v.end(), std::back_inserter(v1), mult);
एक सामान्य नियम के रूप में, प्रारंभ/अंत पुनरावृत्तियों पर संचालन कंटेनर के आकार को नहीं बदलता है।
आपके कोड ने डेटा को एक खाली बफर में, स्मृति को दूषित या बदतर बना दिया है।
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।