C++ Primer(第五版) 15.8--15.8.1节练习

vector不同类型使用net_price函数结果差异

15.28    

#include <iostream>
#include <vector>
#include <memory>
#include "Quote.h"

using namespace std;

int main()
{
	Bulk_quote item("a2", 7.7, 10, 0.2);
		
	vector<Quote> qv;
	qv.push_back(item);
	
	double sum1 = 0.0;
	for (auto &q : qv)
		sum1 += q.net_price(20);
	cout << sum1 << endl;
	
	vector<shared_ptr<Quote>> pitem;
	pitem.push_back(make_shared<Bulk_quote>(item));
	
	double sum2 = 0.0;
	for (auto &q : pitem)
		sum2 += q->net_price(20);
	cout << sum2 << endl;

	return 0;
}

15.29    见上题。用vector<Quote>与用vector<shared_ptr<Quote>>结果不同,前者仍然使用Quote类中的net_price函数计算,后者用Bulk_quote的net_price函数。

15.30    修改Quote.h文件,增加clone函数:

#ifndef	QUOTE_H
#define	QUOTE_H

#include <iostream>

using namespace std;

class Quote {
public:
	Quote() = default;
	Quote(const string &book, double sales_price):
				bookNo(book), price(sales_price) { }
	Quote(const Quote &q):
				bookNo(q.bookNo), price(q.price) { }
	Quote(Quote &&q):
				bookNo(std::move(q.bookNo)), price(std::move(q.price)) { }
	Quote& operator=(const Quote&);
	Quote& operator=(Quote &&q);
	string isbn() const { return bookNo; };
	virtual double net_price(size_t n) const
					{ return n * price; }
	virtual void debug() { cout << "bookNo: "<< bookNo << " price: " << price << endl; }
	virtual ~Quote() = default;
	
	virtual Quote* clone() const & { return new Quote(*this); }
	virtual Quote* clone() && { return new Quote(std::move(*this)); };
	
private:
	string bookNo;
protected:
	double price = 0.0;
};

class Bulk_quote: public Quote {
public:
	Bulk_quote() = default;
	Bulk_quote(const string &book, double p, size_t qty, double disc):
		Quote(book, p), min_qty(qty), discount(disc) { }
	Bulk_quote(const Bulk_quote &b):
		Quote(b), min_qty(b.min_qty), discount(b.discount) { }
	Bulk_quote(Bulk_quote &&b):
		Quote(std::move(b)), min_qty(std::move(b.min_qty)), discount(std::move(b.discount)) { }
	Bulk_quote& operator=(const Bulk_quote&);
	Bulk_quote& operator=(Bulk_quote&&);
	~Bulk_quote() = default;
	void debug() override { Quote::debug(); cout << "min_qty= " << min_qty << " discount= " << 
				discount << endl; }
	double net_price(size_t) const override;
	
	Bulk_quote* clone() const & { return new Bulk_quote(*this); }
	Bulk_quote* clone() && { return new Bulk_quote(std::move(*this)); }
	
private:
	size_t min_qty = 0;
	double discount = 0.0;
};

double print_total(ostream &os, const Quote &item, size_t n);


#endif

Basket.h文件:

#ifndef BASKET_H
#define	BASKET_H

#include <memory>
#include <set>
#include "Quote.h"

using namespace std;

class Basket {
public:
	void add_item(const Quote &sale)
		 { items.insert(shared_ptr<Quote>(sale.clone())); }
	double total_receipt(ostream&) const;
private:
	static bool compare(const shared_ptr<Quote> &lhs, const shared_ptr<Quote> &rhs)
				{ return lhs->isbn() < rhs->isbn(); }
	multiset<shared_ptr<Quote>, decltype(compare)*> items{compare};
};

double Basket::total_receipt(ostream &os) const 
{
	double sum = 0.0;
	
	for (auto iter = items.cbegin(); iter != items.cend(); iter = items.upper_bound(*iter))
		sum += print_total(os, **iter, items.count(*iter));
	
	cout << "Total Sale: " << sum << endl;
	
	return sum;
}


#endif

测试主程序:

#include <iostream>
#include <vector>
#include <memory>
#include "Quote.h"
#include "Basket.h"

using namespace std;

int main()
{
	Quote q1("a1", 8.9);
	Bulk_quote q2("a2", 7.7, 10, 0.2);
		
	Basket b;
	for (auto i = 0; i < 10; ++i)
		b.add_item(q1);
	for (auto j = 0; j < 20; ++j)
		b.add_item(q2);
	
	b.total_receipt(cout);

	return 0;
}

 

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值