我有一个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[]版本,因为我没有看到真正的区别,而且它更少代码。请事先提出建议并向大家表示感谢。
发布于 2018-10-01 09:17:13
insert和operator[]都是非常有用的方法。他们看起来很相似,然而,细节使他们非常不同。
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;完全可以做您想做的事情。
然而,如果我不得不写它,我将使用插入的变体:
auto successfulInsert = baseData.emplace(SC_val, _value).second;
assert(successfulInsert && "Value has been inserted several times.");发布于 2018-10-01 03:38:43
只是使用操作员[]完全适合你的情况。
FYI:引用地图
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.我看不出有什么真正的区别,更不用说代码了。
你是对的!
发布于 2018-10-01 03:44:41
似乎只希望在baseData中不存在数据时才插入数据。您可以使用count()检查数据是否在地图中,如下所示:
int index = static_cast<int>(_Data);
if(!baseData.count(index))
{
baseData[index] = _value
}https://stackoverflow.com/questions/52584182
复制相似问题