C++(STL map)等效于Python的setdefault的方法
C++ (STL map) equivalent method to Python's 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);
最让我恼火的是这三行:
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);
问题-
C++
提供这样的功能吗? 如果没有,是不是每个人都在写这三行?
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
所涵盖的一般情况,我什么都不知道。您可能能够通过为映射提供自定义分配器来获得效果,但我认为我不推荐这样做。
相关文章:
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- Pybind11:将元组列表从Python传递到C++
- 如何在c++中使用引用实现类似python的行为
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 递归列出所有目录中的C++与Python与Ruby的性能
- IPC使用多个管道和分支进程来运行Python程序
- 从python中调用C++函数并获取返回值
- Python 3.7 和 excess_args 的 SWIG 问题
- Python中的for循环与C++有何不同
- 使用Pybind11向Python公开Eigen::张量
- Python str to C++ to Python str
- 如何使用Python从C++中读取谷物序列化数据
- 如何在C++中使用pybind11加载一个pickle python列表
- 如何在c++中使用system()来运行包含空格的python脚本
- python集合的C++等价物是什么.计数器
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 从python调用openMP共享库时,未定义opnMP函数
- 使用JsonCpp将数据返回到带有pybind11的python会在python调用中产生Symbol not foun
- 如何将真正的字符串从python c-api转换为python脚本
- C++(STL map)等效于Python的setdefault的方法