C++(STL map)等效于Python的setdefault的方法

C++ (STL map) equivalent method to Python's setdefault

本文关键字:Python setdefault 方法 STL map C++      更新时间:2023-10-16

所以这个问题很可能已经被问过了。

每次我定义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);

最让我恼火的是这三行:

if (mapTmp.find(iKey) == mapTmp.end())
    mapTmp.insert(pair<int, IntVector>(iKey, IntVector()));
mapTmp[iKey].push_back(iVal);

Python提供了一个非常有用的字典函数:setdefault,它本质上把这三行合并成一个漂亮的行。如果我想用c++写,它会是:

mapTmp.setdefault(iKey, IntVector()).push_back(iVal);

问题
  1. C++提供这样的功能吗?
  2. 如果没有,是不是每个人都在写这三行?

c++标准库定义的映射有一些违反直觉的行为,仅仅调用operator[]就可以改变数组。换句话说,你的"如果不在映射中,那么插入一个默认值"的逻辑是完全多余的——下面两个段是等价的:

if (mapTmp.find(iKey) == mapTmp.end())
    mapTmp.insert(pair<int, IntVector>(iKey, IntVector()));
mapTmp[iKey].push_back(iVal);

:

mapTmp[iKey].push_back(iVal);

第二种情况,如果iKey在map中不存在,则首先默认初始化。对于一个向量,这相当于插入一个空向量。

对于Python的setdefault所涵盖的一般情况,我什么都不知道。您可能能够通过为映射提供自定义分配器来获得效果,但我认为我不推荐这样做。