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

Nat*_*one 1 c++ methods std

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

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

我的问题基本上是我是否应该使用operator[]来达到这个目的,或者是否有任何我没有考虑到的问题。另外,如果我对这些方法的理解有误,请纠正我。

这就是我要做的。Data 是存储类型 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;
 }
}
Run Code Online (Sandbox Code Playgroud)

或者我应该这样做

int index = static_cast<int>(_Data);

baseData[index] = _value;
Run Code Online (Sandbox Code Playgroud)

我倾向于使用operator[]版本,因为我认为没有真正的区别,而且代码少得多。请各位指教并提前谢谢大家。

JVA*_*pen 5

insert都是operator[]非常有用的方法。它们看似相似,但细节却截然不同。

操作员[]

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

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

插入

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

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

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

插入或分配

Tnx 给 Marc Glisse,他在评论中提到了这一点。

此方法类似于insert. 不同之处在于元素已存在时的行为,在这种情况下它将覆盖现有元素。

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

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

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

构建你的地图

您的用例将数据插入到映射中并假设该键不存在。写作baseData[index] = _value;将完全达到你想要的效果。

但是,如果我必须写它,我会使用插入变体:

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