Почему итератор из unordered_set доступен только для чтения?

#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_set>


using namespace std;
struct Car {
    int plate;
    int fuel = 0;
    Car(int plate) : plate(plate) { }

    inline bool operator==(const Car& car) const {
        return car.plate== this->plate;
    }
};

namespace std{
template<>
struct hash<Car> {
    size_t operator()(const Car& x) const {
        return x.plate;
    }
};
}

int main(){
    unordered_set<Car> cars;
    Car c1(123);
    cars.insert(c1);
    auto it = cars.begin();
    while (it != cars.end()){
        // ERROR: assignment of member 'Car::fuel' in read-only object
        it->fuel = 1;
        ++it;
    }
    return 0;
}

В приведенном выше примере, как я могу изменить топливо автомобиля? Использование vector не вызывает этой проблемы.


person Yeo    schedule 26.08.2016    source источник
comment
@nrussell мне нужно изменить атрибут объекта, поэтому мне нужно создать struct для моделирования проблемы, если это int, я не могу смоделировать проблему.   -  person Yeo    schedule 26.08.2016
comment
Есть ли причина, по которой вам нужен unordered_set? Вы не должны (не можете) изменять ключ в отсортированных контейнерах.   -  person NathanOliver    schedule 26.08.2016
comment
std::unordered_set использует хеш-таблицу для хранения элементов. Каждый элемент хранится на основе ключа, возвращаемого хэш-функцией. Теперь, если вы измените значение элемента, у вас будет элемент, хранящийся в хэш-таблице, который (возможно) не соответствует ключу, возвращаемому хэш-функцией для нового значения.   -  person DeiDei    schedule 26.08.2016
comment
Просто поймите, что это дублирующий вопрос, изменение на unordered_map - лучшее возможное решение на данный момент. @NathanOliver, мне нужно установить свойство из-за проверки уникальности.   -  person Yeo    schedule 26.08.2016
comment
@Йео Хорошо. Тогда unordered_map должно быть тем, что вам нужно.   -  person NathanOliver    schedule 26.08.2016