【发布时间】:2018-10-01 03:23:11
【问题描述】:
我有一个 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[] 版本,因为我看不出真正的区别,而且代码少得多。请提前告知并感谢大家。
【问题讨论】:
-
operator[]要求映射的值有一个默认构造函数和一个赋值运算符,并且默认构造映射中的新值,如果它不存在,那么你的=分配它.根据类的不同,这可能比insert()效率低。 -
查看 C++17 insert_or_assign。