Windows下g++编译LeetCode代码报std::map无insert_or_assign错误
编译错误原因与解决方法
核心报错原因
- 报错的本质不是编译器本身不支持这个接口,是编译时指定的C++标准版本过低:
std::map::insert_or_assign是C17标准正式纳入的map成员方法,只要编译时没有显式开启C17及以上版本的标准支持,g++就会按低版本标准的规则检查成员,自然会报“类无对应成员”的错误。 - 常见的场景触发原因:Windows环境下通过MinGW安装的g++,在GCC 11之前的版本,默认启用的C标准是C14,本身就不包含C++17新增的接口,自然无法识别
insert_or_assign方法。
快速解决方式
方法1:编译时显式指定C++标准版本
在原有的g++编译命令中追加-std=c++17参数,完整可运行的编译命令为:
g++ -std=c++17 p15.cpp -o p15.exe
执行上述命令即可消除当前的成员不存在报错。
注意:如果你在VSCode中通过内置的编译按钮执行构建,需要找到项目下
.vscode/tasks.json文件,在编译参数列表里追加-std=c++17,才能保证IDE触发的编译命令也符合标准要求,避免手动在终端敲命令能编译、点按钮编译又报错的情况。
方法2:替换为兼容低版本标准的等价写法
如果不想调整编译参数,也可以直接把代码中使用insert_or_assign的行替换为C++11就支持的等价逻辑,完全不需要额外加编译参数:
- 原代码行:
store.insert_or_assign(arg_nums[0], v); - 替换为:
store[arg_nums[0]] = v;
二者语义完全一致:如果键不存在就插入键值对,如果键已存在就覆盖原有的值,效果和insert_or_assign没有区别。
内容的提问来源于stack exchange,提问作者Vishwad
相关产品推荐
相关产品推荐

