4

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

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

问题

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

1 回答 1

6

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地图中不存在,则首先默认初始化。对于向量,这与插入空向量相同。

对于 Pythonsetdefault涵盖的一般情况,我什么都不知道。您可以通过为地图提供自定义分配器来获得效果,但我不认为我会推荐它。

于 2015-07-16T06:28:30.523 回答