【C++】关于map的一些奇怪问题:map 下标 *** 作[key]需要有默认构造函数

【C++】关于map的一些奇怪问题:map 下标 *** 作[key]需要有默认构造函数,第1张

【C++】关于map的一些奇怪问题:map 下标 *** 作[key]需要有默认构造函数

在做题,然后跑出了些奇奇怪怪的东西,简单记录一下。



这问题是关于map的,或者说是关于map的operator[]函数,若出现了没有默认构造函数的类在“键值对”的“值”上时,这个map的operator[]函数就直接废掉,而且还给出奇奇怪怪的报错,当时还查很久才发现是map的问题。但我不想为我的类设置一个无用的空构造函数,就只能用map::insert和map::find来绕开使用operator[]了,可以说很恶心。

示例代码在下面,直接看代码比我说上面一大段话要直接明了的多。有兴趣可以尝试。
估计会有巨佬直接翻源码查原因,(我用Ctrl+鼠标左键跳转到函数定义后看了几秒后就关掉了,完全看不懂源码写了些啥

#include
using namespace std;
class Test {
public:
	int num;
	Test(int Num) :num(Num) {}
};
int main() {
	mapmmm;//个人命名习惯。对于一些没啥用的、单纯拿来debug的变量,个人喜欢用aaa、sss、xxx之类的变量名来命名
	//这不仅省事,而且在规范的代码里头会很扎眼,debug之后不容易忘了把它删掉
	//但要是通篇都是aaa bbb ccc这样的变量名的话见仁见智,至少我不会这么做
	
//	mmm[3] = Test(0);//【不可用】
	mmm.insert(pair(3, Test(0)));

//	mmm[3].num = 8;//【不可用】
	mmm.find(3)->second.num = 8;

	return 0;
}

把【不可用】的代码取消注释后,进行编译时会出现编译失败的情况。
虽然有几行“消息”已经直接说明是operator[]的锅,但被大量错误信息蒙蔽双眼查找老半天错误在哪。算是经验不足了这次,以后不直接按严重性进行排序,优先文件排序



我也就随便搜搜,没细查深层原因,但既然参考过别人博客,至少放个传送门:map 下标 *** 作 value 需要有默认构造函数

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5650736.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存