我在自学殷人昆著的《数据结构》,书中大部分算法是用模板描述的。最近我想检验各种排序算法的C++实现,于是我想用模板定义各种算法,再实例化,来检测各种算法的复杂度.但由于是很久以前学的模板知识,并且当时也不怎么认真,这几天找了很多资料,都觉得对自己没什么启示(主要是针对下边这段代码的模板实例化而言),看哪位大侠能给我指点迷津,或者能否就该书中的一个模板写个完整的程序作例子?(下边的程序主要是来自该书中的第21,22及302,304页,注释部分中打?的为我感到迷惑的)。
#include<iostream>
using namespace std;const int DefaultSize=100;
template<class Type>class datalist;//数据表的前视声明template<class Type>class Element {//数据表元素类的定义
private:
Type key;//关键码
//field otherdata;//其它数据成员
public:
Type getKey(){return key;}//取当前结点的关键码
void setKey(const Type x) {key=x;}/*修改当前关键码.*/
Element<Type> &operator=(Element<Type> &x){this=x;}//赋值符号重载
int operator==(Type &x){return!(this<x||x<this);}//判this与X相等
int operator!=(Type &x){return this<x||x<this;}/*判this与x不等。*/
int operator<=(Type &x){return !(this>x);}
int operator>=(Type &x){return !(this<x);}
int operator<(Type &x){return this<x;}
friend ostream& operator<<(ostream&outStream,const datalist<Type>& list);//输出重载操作符.
friend istream& operator>>(istream& inSream,const datalist<Type>&list); //输入重戴操作符.
};
template<class Type>class datalist{//用顺序表储存待排序的元素.
public:
datalist(int MaxSz=DefaultSize):MaxSize(Maxsz),CurrentSize(0)/*这一行是不是参数列表?
{Vector=new Element<Type>[MaxSz];}
void swap(Element<Type> &x,Element<Type> &y)
{Element<Type>temp=x;x=y;y=temp;}
private:
Element<Type> *Vector;//存储待排序元素的向量
int MaxSize,CurrentSize;/*向量中最大元素个数与当前元素个数。*/
};template<class Type>ostream&operator <<(ostream& Outstream,const datalist<Type>&list){
Outstream<<"Array Contents:\n";
for(int i=0;i<list.CurrentSize;i++)
OutStream<<endl;
OutStram<<"Array Current Size:"<<list.CurrentSize<<endl;
return OutStream;
}
template<class Type>istream& operator>>(istream&InStream,datalist<Type>&list){
cout<<"Enter array Current Size:";
Instream>>list.CurrentSize;
cout<<"Enter array elements:\n";
for(int i=0;i<list.CurrentSize;i++){
InStream>>list.Element[i];
}
return InStream;
} //下边为直接插入算法的模板。按关键码key非递减顺序对表进行排序。
template<class Type>void InsertionSort(datalist<Type> &list){
for(int i=1;i<list.currentSize;i++)Insert(list,i);}
/*将元素list.Vector[i]按其关键码插入到有序表list.Vector[0],...list.Vector[i-1]中,使得list.Vector[0]到list.Vector[i]有序。*/
template<class Type> void Insert(datalist<Type> &list,int i){
Element<Type>temp=list.Vector[i];int j=i;
while(j>0&&temp.getKey()<list.Vector[j-1].getKey()){
list.Vector[j]=list.Vector[j-1];j--;
}
list.Vector[j]=temp;
}//下边为主函数,也是我感到迷惑的地方?
int main()
{
int MaxSz =15;//
datalist<int>list (MaxSz );//这样实例化对不对?
cout<<"Enter the numbers :"<<endl;
cin>>list ;
InsertionSort(&list );
cout<<"Afer sort:"<<endl;
cout<<list <<endl;
return 1;
} 编译时,提示为"error C2664: 'InsertionSort' : cannot convert parameter 1 from 'class datalist<int> *' to 'class datalist<int> &'
A reference that is not to 'const' cannot be bound to a non-lvalue
Error executing cl.exe." 请问该怎么解决?我昨晚找了很多电子资料,可惜都没找到能解决方法,一直郁闷到现在,请各路神仙搭救。
#include<iostream>
using namespace std;const int DefaultSize=100;
template<class Type>class datalist;//数据表的前视声明template<class Type>class Element {//数据表元素类的定义
private:
Type key;//关键码
//field otherdata;//其它数据成员
public:
Type getKey(){return key;}//取当前结点的关键码
void setKey(const Type x) {key=x;}/*修改当前关键码.*/
Element<Type> &operator=(Element<Type> &x){this=x;}//赋值符号重载
int operator==(Type &x){return!(this<x||x<this);}//判this与X相等
int operator!=(Type &x){return this<x||x<this;}/*判this与x不等。*/
int operator<=(Type &x){return !(this>x);}
int operator>=(Type &x){return !(this<x);}
int operator<(Type &x){return this<x;}
friend ostream& operator<<(ostream&outStream,const datalist<Type>& list);//输出重载操作符.
friend istream& operator>>(istream& inSream,const datalist<Type>&list); //输入重戴操作符.
};
template<class Type>class datalist{//用顺序表储存待排序的元素.
public:
datalist(int MaxSz=DefaultSize):MaxSize(Maxsz),CurrentSize(0)/*这一行是不是参数列表?
{Vector=new Element<Type>[MaxSz];}
void swap(Element<Type> &x,Element<Type> &y)
{Element<Type>temp=x;x=y;y=temp;}
private:
Element<Type> *Vector;//存储待排序元素的向量
int MaxSize,CurrentSize;/*向量中最大元素个数与当前元素个数。*/
};template<class Type>ostream&operator <<(ostream& Outstream,const datalist<Type>&list){
Outstream<<"Array Contents:\n";
for(int i=0;i<list.CurrentSize;i++)
OutStream<<endl;
OutStram<<"Array Current Size:"<<list.CurrentSize<<endl;
return OutStream;
}
template<class Type>istream& operator>>(istream&InStream,datalist<Type>&list){
cout<<"Enter array Current Size:";
Instream>>list.CurrentSize;
cout<<"Enter array elements:\n";
for(int i=0;i<list.CurrentSize;i++){
InStream>>list.Element[i];
}
return InStream;
} //下边为直接插入算法的模板。按关键码key非递减顺序对表进行排序。
template<class Type>void InsertionSort(datalist<Type> &list){
for(int i=1;i<list.currentSize;i++)Insert(list,i);}
/*将元素list.Vector[i]按其关键码插入到有序表list.Vector[0],...list.Vector[i-1]中,使得list.Vector[0]到list.Vector[i]有序。*/
template<class Type> void Insert(datalist<Type> &list,int i){
Element<Type>temp=list.Vector[i];int j=i;
while(j>0&&temp.getKey()<list.Vector[j-1].getKey()){
list.Vector[j]=list.Vector[j-1];j--;
}
list.Vector[j]=temp;
}//下边为主函数,也是我感到迷惑的地方?
int main()
{
int MaxSz =15;//
datalist<int>list (MaxSz );//这样实例化对不对?
cout<<"Enter the numbers :"<<endl;
cin>>list ;
InsertionSort(&list );
cout<<"Afer sort:"<<endl;
cout<<list <<endl;
return 1;
} 编译时,提示为"error C2664: 'InsertionSort' : cannot convert parameter 1 from 'class datalist<int> *' to 'class datalist<int> &'
A reference that is not to 'const' cannot be bound to a non-lvalue
Error executing cl.exe." 请问该怎么解决?我昨晚找了很多电子资料,可惜都没找到能解决方法,一直郁闷到现在,请各路神仙搭救。
解决方案 »
- 网络会议系统问题
- 刚开始学习vc++,请大家推荐书吧。
- 那位牛人知道teechart里的chartgrid组件怎样才能显示我需要的曲线数值,而不是把chart里的所有曲线数值都显示(或怎样把chartgrid里的水平
- 如何用程序实现域名和ip绑定?
- ▲▲▲超简单送500分▲▲▲[vb-dll改vc-dll]
- DirectX的电子书下载
- 继续ADO
- 如何让ie上的一个按钮调自己写的web app,而按钮和webapp均是所要开发插件的一部分?
- ATL中可以使用AfxMessageBox函数吗?
- 急死人了!!!怎样重新建立这个程序?
- 截屏的超级难题,确实是没分了,大家请多见谅!
- CSocket在VC IDE环境中不能使用的问题
改為
InsertionSort(list ); 傳遞的引用而不是指針
Error executing cl.exe.",还有这段有无错误:
int main()
{
int MaxSz =15;//
datalist<int>list (MaxSz );//这样实例化对不对?
應該是datalist(int MaxSz=DefaultSize):MaxSize(MaxSz),CurrentSize(0));
//下边为直接插入算法的模板。按关键码key非递减顺序对表进行排序。
template<class Type>void InsertionSort(datalist<Type> &list){
for(int i=1;i<list.currentSize;i++)Insert(list,i);}
/*将元素list.Vector[i]按其关键码插入到有序表list.Vector[0],...list.Vector[i-1]中,使得list.Vector[0]到list.Vector[i]有序。*/
template<class Type> void Insert(datalist<Type> &list,int i){
Element<Type>temp=list.Vector[i];int j=i;
while(j>0&&temp.getKey()<list.Vector[j-1].getKey()){
list.Vector[j]=list.Vector[j-1];j--;
}
list.Vector[j]=temp;
}
上边是书中的源代码.
實際上根本起不到任何作用。
list.currentSize =0,所以for循環一次都不會執行。///////////////////////////////////////////////////////////////
兄弟,我也是自學的,以過來人的身份奉勸一句,像這樣的問題最好自己解決,實在解決不了再來問吧,另外,你要學的不是代碼,而是思想,所以不提倡你寫書上的代碼,最好是自己寫,哪 怕寫得再爛,那也是自己的。