首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::unordered_map::insert vs std::unordered_map::operator[]

std::unordered_map::insert vs std::unordered_map::operator[]
EN

Stack Overflow用户
提问于 2018-10-01 03:23:11
回答 3查看 3.5K关注 0票数 1

我有一个unordered_map类型的容器,如果我想要向地图中添加一个元素,我需要确认应该使用哪个版本。如果它存在,我希望它用新的值覆盖旧的值,如果不存在的话,只添加它。

我看到insert在退出时添加元素,并返回一对迭代器和bool,其中bool指示插入是否成功。我还看到,如果元素不存在,operator[]会添加该元素,如果它存在,则会覆盖它。

我的问题基本上是,我是否应该为此目的使用operator[],或者有什么问题我还没有考虑过。此外,如果我对这些方法的看法是错误的,请纠正我。

这是我要做的事。数据是存储类型int的作用域枚举。

代码语言:javascript
复制
void insertData(const Data _Data, const int _value)
{
 int SC_val = static_cast<int>(_Data);
 //sc val is now the integer value of the Data being added

 //returns a pair of iterator and bool indicating whether the insert was successful
auto ret = baseData.insert(std::pair<int,int>(SC_val,_value));

 if (ret.second == false)
 {//if the insert was not successful(key already exists)
     baseData[ret.first->first] = _value;
 }
}

或者我应该就这么做

代码语言:javascript
复制
int index = static_cast<int>(_Data);

baseData[index] = _value;

我倾向于使用operator[]版本,因为我没有看到真正的区别,而且它更少代码。请事先提出建议并向大家表示感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-01 09:17:13

insertoperator[]都是非常有用的方法。他们看起来很相似,然而,细节使他们非常不同。

operator[]

返回对正在搜索的元素的引用。当不存在任何元素时,它会创建一个新的默认元素。(因此需要默认构造函数)

当用于插入元素:myMap[key] = value;时,该值将覆盖键的旧值。

插入

返回一个迭代器和一个bool。迭代器指向元素。bool表示是否插入了一个新元素(true),或者它已经包含了一个键元素(false)。

使用insert不需要默认构造函数。

当用于插入新元素:myMap.insert({key, value});时,如果映射中已有键,则旧值不会更新。

insert_or_assign

Tnx给马克·格里斯,他在评论中提到过。

这种方法类似于insert。区别在于元素已经存在时的行为,在这种情况下,它将覆盖现有的元素。

返回一个迭代器和一个bool。迭代器指向元素。bool表示是否插入了一个新元素(true),或者它已经包含了一个键元素(false)。

使用insert_or_assign不需要默认构造函数。

当用于插入新元素:myMap.insert({key, value});时,如果映射中已有键,则更新旧值。

建立你的地图

用例将数据插入到映射中,并假定密钥不存在。编写baseData[index] = _value;完全可以做您想做的事情。

然而,如果我不得不写它,我将使用插入的变体:

代码语言:javascript
复制
auto successfulInsert = baseData.emplace(SC_val, _value).second;
assert(successfulInsert && "Value has been inserted several times.");
票数 5
EN

Stack Overflow用户

发布于 2018-10-01 03:38:43

只是使用操作员[]完全适合你的情况。

FYI:引用地图

代码语言:javascript
复制
std::unordered_map::operator[]
Returns a reference to the value that is mapped to a key equivalent to key, performing an insertion if such key does not already exist.

我看不出有什么真正的区别,更不用说代码了。

你是对的!

票数 1
EN

Stack Overflow用户

发布于 2018-10-01 03:44:41

似乎只希望在baseData中不存在数据时才插入数据。您可以使用count()检查数据是否在地图中,如下所示:

代码语言:javascript
复制
int index = static_cast<int>(_Data);
if(!baseData.count(index))
{
  baseData[index] = _value
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52584182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档