项目中的排序工程
Posted 勇士后卫头盔哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目中的排序工程相关的知识,希望对你有一定的参考价值。
前言
struct Test : public Object
int id;
int data1[1000];
double data2[500];
..................
Test t[1000]
Sort::Bubble(t,1000,false);
如上述代码所示,如果当待排数据元素为体积庞大的对象时,如何提高排序的效率,大家肯定会想到用更高效的排序方法来提高效率,但是发现效率的提高是微不足道的,问题的关键在于排序过程中不可避免的需要进行交换操作,交换操作的本质为数据元素间的相互复制,当数据元素体积较大时,交换操作耗时巨大,所以解决方案为:代理模式
代理模式
定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,通俗的来讲代理模式就是我们生活中常见的中介.
举个例子来说明:
假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了,我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了.用图表示如下:
排序中的代理模式
1.为待排数据元素设置代理对象
2.对代理对象所组成的序列进行排序
3.需要访问有序数据元素时,通过访问代理序列完成
如下图所示,我们会在代码里面创建一个代理对象出来并且在初始化的时候,让代理对象一对一的代理原始的数据元素,接着使用具体的排序函数对代理对象进行排序
代码演示
未使用代理模式前的执行时间
#include <iostream>
#include <ctime>
#include "Sort.h"
#include "StaticArray.h"
using namespace std;
using namespace CGSLib;
struct Test : public Object
int id;
int data1[1000];
double data2[500];
bool operator <(const Test& obj)
return id < obj.id;
bool operator >=(const Test& obj)
return id >= obj.id;
bool operator >(const Test& obj)
return id > obj.id;
bool operator <=(const Test& obj)
return id <= obj.id;
;
int main()
clock_t begin,end = 0;
Test t[50];
for(int i=0;i<1000;i++)
t[i].id = i;
begin = clock();
Sort::Bubble(t,50,false);
end = clock();
cout<<"Time: "<<(end-begin)<<endl;
return 1;
时间
1395
使用代理模式
class TestProxy : public Object
protected:
Test* m_pTest;
public:
int id()
return m_pTest->id;
int* data1()
return m_pTest->data1;
int* data2()
return m_pTest->data2;
Test& test()
return *m_pTest;
bool operator <( TestProxy& obj)
return test() < obj.test();
bool operator >( TestProxy& obj)
return test() > obj.test();
bool operator <=( TestProxy& obj)
return test() <= obj.test();
bool operator >=( TestProxy& obj)
return test() >= obj.test();
Test& operator = (Test& test)
m_pTest = &test;
return test;
;
总结:
代理模式的使用有效避开大对象交换时的耗时操作,代理模式解决方案是空间换时间的思想的体现
以上是关于项目中的排序工程的主要内容,如果未能解决你的问题,请参考以下文章