我有一个类型为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 []版本,因为我看不出真正的区别,而且代码少得多。请提前告知并谢谢大家。
答案 0 :(得分:2)
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;
可以完全满足您的需求。
但是,如果我不得不编写它,我会使用insert变体:
auto successfulInsert = baseData.emplace(SC_val, _value).second;
assert(successfulInsert && "Value has been inserted several times.");
答案 1 :(得分:1)
仅使用运算符[]完全适合您的情况。
仅供参考:引用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.
我看不出真正的区别,而且代码更少。
你是对的!
答案 2 :(得分:-1)
似乎您只想插入baseData中不存在的数据。 您可以使用count()来检查数据是否在地图中,如下所示:
int index = static_cast<int>(_Data);
if(!baseData.count(index))
{
baseData[index] = _value
}