所以很有可能这个问题已经被提出过了。无法找到它。
每次我定义std::map并想要为其插入一些值时,我都会使用这段代码:
using IntVector = vector < int > ;
map<int, IntVector> mapTmp;
int iKey = 7;
int iVal = 9;
if (mapTmp.find(iKey) == mapTmp.end())
mapTmp.insert(pair<int, IntVector>(iKey, IntVector()));
mapTmp[iKey].push_back(iKey);
让我烦恼的是3行:
if (mapTmp.find(iKey) == mapTmp.end())
mapTmp.insert(pair<int, IntVector>(iKey, IntVector()));
mapTmp[iKey].push_back(iVal);
Python提供了一个非常有用的dict函数,名为:setdefault,它基本上将这3行组合成一条漂亮的行。假设我想用C ++编写它,它将是:
mapTmp.setdefault(iKey, IntVector()).push_back(iVal);
C++
是否提供此类功能?答案 0 :(得分:5)
C ++标准库定义的映射具有一些反直觉的行为,仅仅调用operator[]
可以改变数组。换句话说,你的&#34;如果不在地图中,那么插入一个默认的&#34;逻辑完全是多余的 - 以下两个段是等价的:
if (mapTmp.find(iKey) == mapTmp.end())
mapTmp.insert(pair<int, IntVector>(iKey, IntVector()));
mapTmp[iKey].push_back(iVal);
和
mapTmp[iKey].push_back(iVal);
在第二种情况下,如果地图中不存在iKey
,则首先默认初始化。对于矢量,这与插入空矢量相同。
对于Python setdefault
涵盖的一般情况,我不知道任何事情。您可以通过为地图提供自定义分配器来获得效果,但我不认为我会推荐它。