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

标签 python c++ 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);

让我烦恼的是 3 行:

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

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

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

问题

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

最佳答案

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);

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

对于 Python 的 setdefault 涵盖的一般情况,我一无所知。您可以通过为 map 提供自定义分配器来获得效果,但我不推荐这样做。

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

相关文章:

c++ - 在完全专用的类模板中初始化静态成员

C++ 全局函数

c# - 在 List<Dictionary<string,string>> 中选择最小键值对,其中字典值是日期字符串

python - Python 中的多级键和值

python - 如何使用python创建新文件

python - AppEngine MapReduce NDB,重复内部错误 : internal error

c++ - sockaddr_in 获取错误的 IP 地址,cpp

Python:如何从列表字典中计算最小值、最大值、中值、第一和第三四分位数?

python - Numpy 源代码中哪里定义了常量?

python - lxml cssselect 解析