Introduction
This is a really quick tip. std::map
provides an efficient way to write code for the common paradigm: "query-and-insert-if-doesn't-exist".
If you have been using std::map
, one common paradigm you may encounter is: (believe me, you probably already have, even if you didn't realize).
using CMyMap = std::map<std::string, int>;
bool InsertNewItem(const CMyMap &thisMap, const string &key, int value)
{
bool alreadyExisted = false;
if (thisMap.find(key) != thisMap.end()) {
alreadyExisted = true
}
else {
thisMap[key] = value;
}
return !alreadyExisted;
}
The thing is, you can't simply run the following line because otherwise you can't tell if the value is newly inserted.
thisMap[key] = value;
But the code above seems a bit messy for such a simple task, a very common one. Thanks to the designers of STL, this has been considered. std::map()
already provides an overloaded version of insert()
member function to solve it.
bool InsertNewItem(const CMyMap &thisMap, const string &key, int value)
{
std::pair<CMyMap::iterator, bool> res = thisMap.insert(CMyMap::value_type(key, value));
return res.second;
}
The map::insert()
function returns a std::pair
. The first member of this pair is an iterator. It always points to the item in map, whether it's newly created or not. The second member is a bool
value, denoting if key is found before insertion. So it basically implements the semantics we need: "Tell me if this key exists in map, and insert into it if not."