为啥我不能更改 unordered_map 返回的对象的成员变量?

Posted

技术标签:

【中文标题】为啥我不能更改 unordered_map 返回的对象的成员变量?【英文标题】:Why can't I change the member variables of the object returned by an unordered_map?为什么我不能更改 unordered_map 返回的对象的成员变量? 【发布时间】:2014-07-02 05:03:55 【问题描述】:

我有一个 unordered_map 用于存储一些对象。有时,我需要更新地图中某些对象的成员变量。但是由于某种原因,地图中的对象没有更新,我不知道为什么。

我有一个结构:

typedef struct 
    unsigned int JobId : 2;
    bool isActive;
JobEvent;

我有一堂课:

class Job
bool isActive;
void receiveEvent(JobEvent jobEvent);


void receiveEvent(JobEvent jobEvent)
isActive = jobEvent.isActive;

我还有一门课:

class MyClass 

    std::unordered_map<int,Job> jobMap;
    void receiveJobEvents(const std::vector<JobEvent>jobEvents);


void receiveJobEvents(const std::vector<JobEvent>jobEvents)
    int ctr = jobEvents.size();
    for (int i=0; i<ctr; i++)
        JobEvent jobEvent = jobEvents[i];
        Job job = jobMap[jobEvent.jobId]; 
        job.receiveEvent(jobEvent);
        JobEvent jobEvent2 = jobMap[jobEvent.jobId];
    

问题是,Job 中的isActive 的值存储在unordered_map 中并没有改变?当我单步调试调试器时,我可以看到jobisActive 的值发生了变化。但是当我从jobMap(在我获得工作的同一索引处)获得jobEvent2 时,该值是原始值。

为什么 unordered_map 返回一个副本?它不应该返回参考吗?为什么我不能更新 unordered_map 中的值?我究竟做错了什么 ?如何更正?

【问题讨论】:

它确实返回了一个引用,这很容易通过 C++ 引用显示。然后你继续复制它。 【参考方案1】:

在这些行中

    Job job = jobMap[jobEvent.jobId]; 
    job.receiveEvent(jobEvent);

您正在制作Job 的副本并更改副本。

将第一行改为:

    Job& job = jobMap[jobEvent.jobId]; 

【讨论】:

以上是关于为啥我不能更改 unordered_map 返回的对象的成员变量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能用一对作为键来编译 unordered_map?

为啥我不能用一对作为键来编译 unordered_map?

为啥`std::unordered_map::erase(key_type const&)`返回删除元素的数量?

为啥我的返回类型没有意义?

为啥我的 unordered_map 越来越大

为啥不能修改 Mongoose 查询返回的数据(例如:findById)