1020 月饼(附Vector的三种遍历方法和一个关于迭代器的段错误解答)

博客讲述了作者在解决月饼销售优化问题时遇到的思考过程,包括如何计算最大收益和对C++中Vector的不同遍历方式的理解。文中提到错误的Vector遍历方式可能导致程序崩溃,并通过示例解释了原因。文章强调了正确遍历Vector的方法以及在编程中注意空指针的重要性。

1020 月饼

参考代码:https://www.liuchuo.net/archives/543

“一个人的数学能力可以差到什么地步?”
大概就是我。
看见这个题目,我第一反应是把总售价当成单价,想为什么他不把最贵的月饼全卖完,再卖第二贵的,后知后觉反应过来之后,没想到去算月饼的单价,而是以为这个是什么按照经验得出来的结论,就跟蚂蚁搬家要下雨似的·······¥……¥¥&……%&

贴一段柳神的分析吧,看完简直觉得自己智商被碾压·······这个小学算术题欺负我这个读大学的小同志,实在是不讲武德!
在这里插入图片描述

#includeiostream
#includevector
#includealgorithm
using namespace std;
struct MoonCake
{
	float price;//总价
	float number;//库存
	float unit;//单价 
};
bool compare(MoonCake m1,MoonCake m2)
{
	return m1.unitm2.unit;//按单价从高到低排序 
}
int main()
{
	int n=0;//种类数 
	int need=0;//需求量
	cinnneed; 
	vectorMoonCake mooncake(n);
	for(int i=0;in;i++)//注意此处是分开输入的总量和单价 
	{
		cinmooncake[i].number;
	 
	}
	for(int i=0;in;i++)
	{
		cinmooncake[i].price;
		mooncake[i].unit=mooncake[i].pricemooncake[i].number;//总售价库存=单价
	}
	sort(mooncake.begin(),mooncake.end(),compare);
	float result=0.0;
	for(vectorMoonCakeiterator it=mooncake.begin();it!=mooncake.end();it++)//迭代器遍历数组
	{
		if(it-numberneed)//这种月饼的总量大于需求,卖不完 
		{
			result+=needit-unit;//收入就是需求量月饼单价
			break;//不需要再看后面的月饼,直接退出循环 
		}
		else
		{
			result+=it-price; //全卖完这种月饼,盈利就是总售价 
		} 
		need=need-it-number;//月饼少了,需求量还没有填完,需要再卖其他品种的月饼 
	}
	printf(%.2f,result);
	return 0; 
 } 

看见柳神遍历Vector用的for(i=0;i<n;i++)这种形式,有点疑惑为什么不用迭代器,虽然我知道Vector是数组的替代品,但之前网课老师一直讲的迭代器,emm··········

百度之后,搜到了如下教程:
https://blog.csdn.net/fly_time2012/article/details/78590552

原来Vector有三种遍历方法
在这里插入图片描述
方法一是柳神用的
在这里插入图片描述
方法二跟我网课老师的差不多,不过他的写法是for(Vector<类型> :: iterator it=XX.begin() ; it!=XX.end() ; it++)
在这里插入图片描述
方法三有点新鲜,奇怪的知识增加了。

以及,在百度这个遍历的问题时,我还遇到了另一位码友贴出来的错误。
https://blog.csdn.net/FSC12345655/article/details/102552615
在这里插入图片描述

我感觉这个错误很新奇,就找一位很厉害的大神讨论了一下原因。

在这里插入图片描述

确实,这样写不会报错。

在这里插入图片描述
但是一运行,就会导致程序崩溃·····
在这里插入图片描述

大神调试之后的结果:
在这里插入图片描述
在这里插入图片描述
我自己换到release测试的结果:
在这里插入图片描述
之后大神发现,把v.push_back()注释掉,就不会发生段错误。
在这里插入图片描述
自己试试,的确如此。
在这里插入图片描述
大神的理解是,*如果在push_back之前就i=v.begin()的话,此时i是空指针,后面*i就出错了。
而如果在push_back之后i=v.begin()的话,i得到的是vector内第一个元素的地址,不是空指针,i就没有问题

如果注释了push_back,i得到的是空指针,但是此时i=v.end(),for循环没走,就没有*i,没有访问空指针,就不会段错误
在这里插入图片描述

在这里插入图片描述
总之,正确的操作是原作者总结的方法:
在这里插入图片描述
感谢这几位码友和大神的帮助,今天又是站在巨人的肩膀上仰望远方的一天~~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值