背景任务
在开发中使用C++编程时,需要对map类型实例中已存在的key-value数据进行更新,即更新其中某个已存在key-value数据中的value值。
相应代码如下所示:
std::map<std::string, std::vector<uint8_t>> dataStore;
其中
dataSatore
是std::map
实例变量,其key
类型为std::string
,value
类型为std::vector<uint8_t>
错误问题
针对上述背景任务,一开始使用了
std::map
类型内置的insert
方法去更新数据:// 第一次调用 dataStore.insert({"some_key", std::vector<uint8_t>(data_ptr1, data_ptr1 + data_size1)}); ...... // 第二次调用 dataStore.insert({"some_key", std::vector<uint8_t>(data_ptr2, data_ptr2 + data_size2)});
在调试过程中发现在第一次调用
insert
方法时,对应key
为some_key
的value
值会成功置于变量dataStore
中,但在第二次调用insert
方法时,其值没有变化更新为最新值。后来发现是因为这里不应该使用insert
方法。std::map Insert
insert
方法是C++ std::map
中内置方法用于在map中插入数据,其常用语法为:std::pair<iterator, bool> map_name.insert({key, value})
当map中没有对应的
{key, value}
数据时,会将该数据插入到map中;当map中已经有对应
{key, value}
数据时,不会影响已有数据。其返回值为
std::pair
其第一个元素为指向map中已经插入或已存在key-value
数据对的iterator
;第二个元素为bool
值,其为true
时表示插入了新数据,为false
时表示数据已存在。解决方法
更新map中的已有数据,可以:
- 使用操作符
[]
和赋值语句:
dataStore["some_key"] = std::vector<uint8_t>(data_ptr2, data_ptr2 + data_size2)}
- 使用方法
insert_or_assign
,C++ 17:
dataStore.insert_or_assign(std::vector<uint8_t>(data_ptr2, data_ptr2 + data_size2)});
上述方法可以更新map中已存在的数据,或者在没有相应数据时插入新数据。