Передача объекта по указателю и его изменение не изменяет состояние объекта

Код ниже. У меня есть член данных с именем book_b и внутри функции OB::x() этот unordered_map вставляет объекты. При первой вставке ключ равен 10, а новый объект, вставленный с ключом =10, работает нормально. Однако, когда ключ =10 появляется снова, я ожидаю, что новый объект будет создан и вставлен в ключе =10 (заменяя предыдущий объект в ключе =10). Однако, как только OB::x() вернется, когда мы вернемся в OB::y(), это будет как если бы новый объект никогда не был вставлен.

Я думал, что это должно работать, потому что я передаю объект book_b по указателю на функцию, изменяющую ее состояние? Я беспокоюсь, что что-то не так с моим фундаментальным пониманием.

class OB{
    public:
        void y(O lo);
        void x(std::unordered_map<int, PL>* book, int a, long b);

    private:
        std::unordered_map<int, PL> book_b;
        std::unordered_map<int, PL> book_a;
};


void OB::y(O lo){

    //Code which obtains parameters to use in x() from lo
    int a = o.getA();
    long b = o.getB();

    //This is the data member the below function will insert an object in to
    std::unordered_map<int,PL>* book = &book_b;

    //This is the function which should be changing the state of book.
    //It works on the first call (when a new object is inserted) but on repeated calls
    //(where the object may be replaced with a new object with the same key) it acts
    //as if the new key-value pair wasnt replacing the existing key-value pair.

    x(book, a, b);

}


//Works when book is empty and we insert a new PL object, however, when I go to "overwrite"
//an existing PL object with the same key (a) it doesn't hold state once the function returns

void OB::x(std::unordered_map<int,PL>* book, int a, long b){
    PL temp;
    temp.setQuantity(b);
    book->insert(std::make_pair(a, temp));
}

2 ответа

Решение

std::unordered_map::insert не вставляет новый элемент, если элемент с таким же ключом уже существует.

auto p = book->insert(std::make_pair(a, temp));
std::cout << std::boolalpha;
std::cout << "Did insert succeed? " << p.second << std::endl;

Если вы хотите обновить существующий элемент, если он существует, используйте operator[]:

(*book)[a] = temp;

Примечание: вам не нужно передавать указатели, если вы не хотите, чтобы возможность nullptr проходить Проще использовать ссылки:

void OB::x(std::unordered_map<int,PL>& book, int a, long b) { ... }

x(book_b, a, b);

std::unordered_map::insert msgstr "вставляет элемент (ы) в контейнер, если контейнер еще не содержит элемент с эквивалентным ключом."

+ Изменить

book->insert(std::make_pair(a, temp));

в

(*book)[a] = temp;

а также обратите внимание, что передача по ссылке вместо указателя будет более разумной и сделает ваш код намного чище:)

Другие вопросы по тегам