繁体   English   中英

std :: unordered_map :: insert与std :: unordered_map :: operator []

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

我有一个类型为unordered_map的容器,我想确认如果要将元素添加到地图中应该使用哪个版本。 我希望它使用新呈现的旧值覆盖旧的值(如果存在),如果不存在则仅添加它。

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

我的问题基本上是我是否应该为此目的使用operator []或是否有未考虑的问题。 另外,如果我对这些方法的看法不正确,请纠正我。

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

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;
 }
}

还是我应该做

int index = static_cast<int>(_Data);

baseData[index] = _value;

我倾向于使用operator []版本,因为我看不出真正的区别,而且代码少得多。 请提前告知并感谢大家。

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

运算符[]

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

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

插入

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

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

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

insert_or_assign

Tnx感谢Marc Glisse在评论中提到它。

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

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

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

用于插入新元素时: myMap.insert({key, value}); ,如果键已存在于地图中,则旧值将更新。

建立地图

您的用例将数据插入到映射中,并假定该键不存在。 编写baseData[index] = _value; 会完全按照您的意愿做。

但是,如果我不得不编写它,我会使用insert变体:

auto successfulInsert = baseData.emplace(SC_val, _value).second;
assert(successfulInsert && "Value has been inserted several times.");

仅使用operator []完全适合您的情况。

仅供参考:来自cppreference.com std :: unordered_map的报价:

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.

我看不出真正的区别,而且代码少得多。

你是对的!

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

int index = static_cast<int>(_Data);
if(!baseData.count(index))
{
  baseData[index] = _value
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM