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

每次我定义一个 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++ 是否提供这样的功能?
  • 如果不是,是不是每个人都一直写那三行?
  • 最佳答案

    C++ 标准库定义的映射有一些违反直觉的行为,仅仅调用 operator[] 就可以改变数组。换句话说,您的“如果不在 map 中,则插入默认值”逻辑完全是多余的 - 以下两个部分是等效的:

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

    和:
    mapTmp[iKey].push_back(iVal);
    

    在第二种情况下,如果 map 中不存在 iKey,则首先对其进行默认初始化。对于 vector ,这与插入空 vector 相同。

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

    关于python - C++ (STL map) 等效于 Python 的 setdefault 方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31446640/

    10-09 17:14
    查看更多