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

ida*_*hmu 2 c++ python dictionary stl setdefault

所以很可能这个问题已经被提出过了.找不到它.

每次我定义一个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);
Run Code Online (Sandbox Code Playgroud)

让我恼火的是3条线:

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

Python提供了一个非常有用的dict函数,名为:setdefault,它基本上将这3行组合成一条漂亮的行.假设我想用C++编写它,它将是:

mapTmp.setdefault(iKey, IntVector()).push_back(iVal);
Run Code Online (Sandbox Code Playgroud)

问题

  1. 是否C++提供这样的功能?
  2. 如果不是,每个人都会一直写下这3行吗?

cel*_*rel 5

由C++标准库定义的映射具有一些反直觉的行为,仅仅调用operator[]可以改变数组.换句话说,您的"如果不在地图中然后插入默认"逻辑完全是多余的 - 以下两个段是等价的:

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

和:

mapTmp[iKey].push_back(iVal);
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,如果iKey地图中不存在,则首先进行默认初始化.对于矢量,这与插入空矢量相同.

对于Python的一般情况setdefault,我不知道任何事情.您可以通过为地图提供自定义分配器来获得效果,但我认为我不推荐它.