Bir elemanların anahtar değerleri std::setolan constiyi bir nedenle. Bunları değiştirmek a için gerekli olan düzeni yok edebilir std::set.
Bu nedenle, çözüm yineleyiciyi silmek ve anahtarla yeni bir tane eklemektir *it - sub. Lütfen std::set::erase()while döngüsünün düzgün çalışmasını sağlamak için sizin durumunuzda kullanılması gereken yeni bir yineleyici döndürdüğünü unutmayın .
#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';
}
Çıktı:
test: { 11, 12, 13, 14, 15 }
test: { 1, 2, 3, 4, 5 }
Coliru'da Canlı Demo
Üzerinde std::setyineleme yaparken yapılan değişiklikler genel olarak bir sorun değildir, ancak ince sorunlara neden olabilir.
En önemli gerçek, kullanılan tüm yineleyicilerin sağlam kalması veya artık kullanılmaması gerektiğidir. (Bu nedenle, silme öğesinin geçerli yineleyicisi, dönüş değeri std::set::erase()ya sağlam bir yineleyici veya kümenin sonu olan atanmış olarak atanır .)
Elbette, elemanlar mevcut yineleyicinin arkasına da eklenebilir. Bu bir sorun olmasa std::setda, yukarıdaki örneğimin döngüsünü kırabilir.
Göstermek için yukarıdaki örneği biraz değiştirdim. Döngünün sonlandırılması için ek bir sayaç eklediğimi lütfen unutmayın:
#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';
}
Çıktı:
test: { 11, 12, 13, 14, 15 }
test: { 23, 24, 25, 31, 32 }
Coliru'da Canlı Demo