我有一个 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[]版本,因为我认为没有真正的区别,而且代码少得多。请各位指教并提前谢谢大家。
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)
| 归档时间: |
|
| 查看次数: |
4456 次 |
| 最近记录: |