У меня есть некоторые объекты в unordered_set
, которые в какой-то момент необходимо обновить таким образом, чтобы не изменить поведение функции хеширования или оператора сравнения. Разделение структуры на карту или наличие изменяемого поля сейчас не вариант. Я придумал решение:
struct X { int x, y; };
// operator== and hash defined using only x
std::unordered_set<X> mySet;
// insert a bunch of stuff...
mySet.emplace(1, 2); // y contains 2
// get an iterator and a reference to the element
auto it = mySet.find(X{ 1, 3 }); // (y field here doesn't matter)
const X& ref = *it; // get a pointer to the element
std::cout << ref.y << '\n'; // 2
std::cout << it->y << '\n'; // 2
// now i want to change y to 4
mySet.erase(it);
mySet.emplace_hint(it, 1, 4); // y now contains 4
std::cout << ref.y << '\n'; // 4 or UB?
std::cout << it->y << '\n'; // 4 or UB?
Это прекрасно компилируется и работает с clang, но я не уверен, что стандарт позволяет мне это делать, поскольку стирание делает недействительным итератор, в котором был стерт элемент. Используя метод insert() с одним и тем же значением (с подсказкой итератора или без нее), гарантируется, что новый элемент будет сохранен в той же ячейке памяти, таким образом "повторно проверяя" итераторы и ссылки?
X
средства доступаmutable
к его частям без хеширования? - person Kerrek SB   schedule 05.03.2018extract
, чтобы получить сам узел из контейнера, изменить элемент, а затем вернуть узел обратно. - person Kerrek SB   schedule 05.03.2018std::swap
? - person super   schedule 05.03.2018