एक में तत्वों की कुंजी मान std::setरहे हैं constएक अच्छे कारण के लिए। उन्हें संशोधित करना उस आदेश को नष्ट कर सकता है जो एक के लिए आवश्यक है std::set।
इसलिए, समाधान यह है कि पुनरावृत्त को मिटा दें और कुंजी के साथ एक नया डालें *it - sub। कृपया, ध्यान दें कि std::set::erase()एक नया पुनरावृत्त रिटर्न देता है जिसका उपयोग आपके मामले में किया जाता है, जबकि लूप ठीक से काम करने के लिए।
#include<iostream>
#include<set>
template <typename T>
std::ostream& operator<<(std::ostream &out, const std::set<T> &values)
{
const char *sep = "{ ";
for (const T &value : values) { out << sep << value; sep = ", "; }
return out << " }";
}
int main()
{
std::set<int> test{ 11, 12, 13, 14, 15 };
std::cout << "test: " << test << '\n';
const int sub = 10;
std::set<int>::iterator iter = test.begin();
while (iter != test.end()) {
const int value = *iter;
iter = test.erase(iter);
test.insert(value - sub);
}
std::cout << "test: " << test << '\n';
}
आउटपुट:
test: { 11, 12, 13, 14, 15 }
test: { 1, 2, 3, 4, 5 }
कोलिरु पर लाइव डेमो
इस पर std::setपुनरावृत्ति करते समय परिवर्तन सामान्य रूप से समस्या नहीं है, लेकिन सूक्ष्म मुद्दों का कारण बन सकता है।
सबसे महत्वपूर्ण तथ्य यह है कि सभी उपयोग किए गए पुनरावृत्तियों को अक्षुण्ण रखा जाना चाहिए या अब उपयोग नहीं किया जा सकता है। (इसीलिए इरेज़ एलिमेंट का करंट इटरेटर रिटर्न वैल्यू के साथ असाइन किया गया है, std::set::erase()जो या तो एक इंटेक्ट इटरेटर है या सेट के अंत में है।)
बेशक, तत्वों को वर्तमान पुनरावृत्त के पीछे भी डाला जा सकता है। हालांकि यह एक समस्या नहीं है, क्योंकि std::setयह मेरे उपरोक्त उदाहरण के पाश को तोड़ सकता है।
इसे प्रदर्शित करने के लिए, मैंने उपरोक्त नमूने को थोड़ा बदल दिया। कृपया, ध्यान दें कि मैंने लूप को समाप्त करने के लिए एक अतिरिक्त काउंटर जोड़ा है:
#include<iostream>
#include<set>
template <typename T>
std::ostream& operator<<(std::ostream &out, const std::set<T> &values)
{
const char *sep = "{ ";
for (const T &value : values) { out << sep << value; sep = ", "; }
return out << " }";
}
int main()
{
std::set<int> test{ 11, 12, 13, 14, 15 };
std::cout << "test: " << test << '\n';
const int add = 10;
std::set<int>::iterator iter = test.begin();
int n = 7;
while (iter != test.end()) {
if (n-- > 0) {
const int value = *iter;
iter = test.erase(iter);
test.insert(value + add);
} else ++iter;
}
std::cout << "test: " << test << '\n';
}
आउटपुट:
test: { 11, 12, 13, 14, 15 }
test: { 23, 24, 25, 31, 32 }
कोलिरु पर लाइव डेमो