CList类是作什么用的?
可以直接使用CList类,不需要加头文件
建一个struct来保存这4个变量,然后建一个该结构的CList做为CCylinder类的成员.你可以重载[]操作符来取任意位置的薄片信息.
CList 类2007年06月22日 星期五 09:55C++中实现通用数据结构在程序设计当中经常会出现使用同种数据结构的不同实例的情况。例如:在一个
程序中可以使用多个队列、树、图等结构来组织数据。同种结构的不同实例,也
许只在数据元素的类型或数量上略有差异,如果对每个实例都重新定义,则非常麻
烦且容易出错。那么能否对同种类型数据结构仅定义一次呢?答案是肯定的,C++
提供的类模板(Class Template)就可以实现该功能。
一、类模板
类模板是C++提供的一种特殊机制,通过它我们可以定义一种特殊的类(称为模板
类),在类的定义中可以包含待定的类型参数,在声明类的实例时,系统会自动根据
传递的类型生成用户想要生成的类实例。下面是用C++实现的一个简单的模板类
Clist的定义。
Template <class T, int I> class CList
{
public:
int SetItem(int Index, const T &Item);
int GetItem(int Index, T &Item);
private:
T Buffer[I];
}
在这里,T是类型参数,I是整型常量参数。T和I的实际值是在声明具体类实例时指
定的。模板类的<>号内可以包括任意个类型参数和常量参数(至少要有一个参数
)。类型参数和常量参数可以是任何合法的标准类型和用户自定义类型,包括简单
类型及各种结构体。同其他类一样,类成员函数SetItem的实现可以在类定义内完
成,也可以在类CList定义处实现:
template<class T, int I> int CList<T, I>::SetItem(int Index, const T
&Item)
{
if ( (Index<0)||(Index>I-1) )
return 0; // 出错
Buffer[Index]= Item ;
return 1; // 成功
}
值得注意的是,在类定义外完成函数实现时,必须以关键字template和类模板定义
中相同的参数表(<>号内的)开头(上例为template<class T, int I>),并且范围
分解操作符前的类名后应跟上模板参数名清单(上例为CList<T, I>)。另外,与非
模板类不同的是,必须将函数实现包括在调用它的每个源文件中,使编译器能从函
数实现产生代码。通常的做法是将模板类的函数实现也放在定义该类的头文件中
,这样只需在调用的源文件中包含该头文件即可。
那么,如何使用生成特定的类实例呢?我们可以像使用其他类一样来使用模板类,
不过必须指定模板参数的值。例如采用如下声明:
CList <int, 100> IntList;
则使IntList成为CList类的实例,每次出现的T参数都换成int, 每次出现的I参数
都换成100。这样,IntList类中的Buffer就是一个长度为100的整型数组,
SetItem和GetItem函数参数是int值的引用。例:
IntList.SetItem(0, 5); //给数组第一个元素赋为整数5
模板类还可以像其他类一样可以定义构造函数和析构函数。下面我们以一种简单
的数据结构——堆栈为例,来说明如何用类模板来构造通用数据结构。
二、 利用类模板实现通用堆栈结构
任何抽象数据结构在计算机中的实现,归根结底都只有两种方式:顺序存储(用数
组实现),链式存储(用指针实现)。堆栈也不例外,按其实现方式可分为顺序栈(用
数组实现)和链栈(用指针实现)。
1. 通用顺序栈的实现
因为顺序栈中的元素在空间上连续存储,栈顶的元素位置需要注明,所以构造顺序
栈的模板类应该有这样的一些成员变量:一个待定类型和长度的数组Buffer,一个
记录栈顶元素的数组下标的整型变量top。堆栈的基本操作主要有:入栈(Push)、
出栈(Pop)、置空(SetEmpty)、判断当前状态(IsEmpty)等,它们应用模板类的成
员函数来实现。作为一个标准的类,它还应该有自己的构造函数和析构函数。具
有这些功能的模板类,就可以作为一个通用的顺序栈来使用了。该类的定义如下
:
template <class T,int SIZE> class CArrayStackTemp
{
public:
CArrayStackTemp () //缺省构造函数,构造一个空堆栈
{
top= -1;
};
~ CArrayStackTemp (){};//析构函数
void SetEmpty (); //置空堆栈
bool IsEmpty(); //判断堆栈是否为空
bool Push(T element); //入栈
bool Pop(T& element);//出栈
private:
T Buffer[SIZE];
int top;
};
与堆栈的基本操作相对应的成员函数的实现如下:
template <class T, int SIZE> void CArrayStackTemp<T, SIZE>::
SetEmpty ()
{
top= -1; //将栈顶指针赋 -1,并不实际清除数组元素
}
template <class T, int SIZE> bool CArrayStackTemp<T, SIZE>:: IsEmpty
()
{
return(top == -1);
}
template <class T, int SIZE> bool CArrayStackTemp<T, SIZE>:: Push (T
element)
{
top++;
if (top>SIZE-1)
{
top--;
return false; //堆栈已满,不能执行入栈操作
}
Buffer[top]=element;
return true;
}
template <class T, int SIZE> void CArrayStackTemp<T, SIZE>:: Pop (T&
element)
{
if (IsEmpty())
return false;
element =Buffer[top];
top--;
return true;
}
根据实际需要,还可以扩充堆栈功能。例如:加入取栈顶元素、求堆栈长度等操作
,其方法如上。
2. 通用链栈的实现
模板类中允许使用指针和定义自己的结构,这就为实现链式结构提供了保证。这
里采用一个单链表来实现堆栈,栈顶指针指向链表的第一个结点,入栈和出栈均在
链表的头进行。该模板类的定义如下:
template <class T> class CLinkStackTemp
{
public:
//类的缺省构造函数,生成一个空堆栈
CLinkStackTemp ()
{
top=NULL;
};
~ClinkStackTemp(){}; //析构函数
//定义结点结构
struct node
{
T
data; //入栈元素
node* next; //指向下一结点的指针
};
void SetEmpty(); //置空堆栈
bool IsEmpty(); //判断堆栈是否为空
bool Push(T element); //压入堆栈
bool Pop(T& element);//弹出堆栈
private:
node* top;
};
该类的成员函数实现如下:
template <class T> void CLinkStackTemp <T>::SetEmpty()
{
//释放堆栈占用的内存
node* temp;
while (top!=NULL)
{
temp=top;
top=top->next;
delete temp;
}
}
template <class T> bool CLinkStackTemp <T>::IsEmpty()
{
return (top==NULL);
}
template <class T> bool CLinkStackTemp <T>::Push(T element)
{
node* temp=new node();
if (temp ==NULL)
return false ;
temp->data=element;
temp->next=top;
top=temp;
return true;
}
template <class T> bool CLinkStackTemp <T>::Pop(T& element)
{
if ( IsEmpty())
return false;
node* q = top;
element = top->data;
top=top->next;
delete q;
return true;
}
与顺序栈的实现略有不同,链栈不必指定栈的容量,其大小可以是近似"无限"的。
为了程序的使用方便,我们同样可以加入一些增强的功能。
三、 通用堆栈类的使用
通用堆栈类的使用较为简单,堆栈类的实例就是一个可以方便使用的堆栈。对堆
栈的操作都是通过类的成员函数来实现的。使用的具体步骤如下:
1. 在要使用堆栈类的程序代码的文件开头包括模板类及其成员函数的定义。
2. 类的实例化,可声明成变量,也可以声明它的指针,如:
CArrayStackTemp <int, 100> intStack; //生成一个长度为100的int型堆栈
//生成一个元素为Record型的堆栈,Record为自定义结构
CLinkStackTemp <Record>* RecordStack;
RecordStack=new CLinkStackTemp<Record>;
应注意在定义顺序栈时,必须指定栈的大小,而链栈则不必。另外在指定指针类型
和执行new操作时,必须对模板参数赋值,并且前后要一致。
3. 对堆栈进行操作,如:
intStack.Push(3); //将整数3入栈
RecordStack.SetEmpty(); //将堆栈置空
无论我们使用哪种堆栈类,对用户来讲都是透明的,操作起来并无差别。
CList类的两个参数什么意思啊?第一个参数表示链表中存储的数据类型,后面一个表示链表类中函数参数的传递方式,通常为存储数据类型的引用。
CList<string,string> MyList_x;
CList<string,string&>MyList_y;
//两种方式实现的功能一样,不过后面一个更加高效。
CList <int,string> list;声明方式就是错误,
CList <int,int>list1;CList <int,char>list2;CList<char,int> list3;都是可以接受的声明方式。
我举一个函数例子来说明这一点。
template <class TYPE ,class ARG_TYPE>
class ELEMENT
{
TYPE data;
public:
TYPE set_value(ARG_TYPE m){ data=m+m;}
};
进行如下调用
string z("hello");
ELEMENT<string,string> sample;
sample.set_value(z);
ELEMENT<string,string&> example;//sample,example得到的是完全一样的数据,但是第二种操作高效
example.set_value(z);
ELEMENT<int,char> demo_a;//由于int,char 支持自动类型转化,可以混合两种类型进行声明
ELEMENT<int,int> demo_b;
ELEMENT<char,char> demo_c;
ELEMENT<char,int> demo_d;
demo_a.set_value(''c'');
demo_b.set_value(20);
demo_c.set_value(''c'');
demo_d.set_value(15);
//ELEMENT <int ,string> demo;//这两行错误调用,单纯该行的申明可以通过编译,
//demo.set_value(string(hello));//但是有了这一行编译器就不客气了,不能通过
Python中内置数据类型list,tuple,dict,set的区别和用法
这篇文章主要给大家介绍了Python中内置数据类型list,tuple,dict,set的区别和用法,都是非常基础的知识,十分的细致全面,有需要的小伙伴可以参考下。Python语言简洁明了,可以用较少的代码实现同样的功能。这其中Python的四个内置数据类型功不可没,他们即是list, tuple, dict, set。这里对他们进行一个简明的总结。List...
Python的tuple与list有什么不同,各有什么作用?
1. tuple是一种不可变的有序列表,与list类似但无法修改。2. tuple一旦创建就不能更改,没有append()、insert()等修改方法,只能访问元素。3. tuple通常用于存储不会改变的数据集合,如函数从多个值返回时。4. list适合存储不确定数量的同类型数据,如队列。5. list可以用作字典的键,而tuple由于不...
存储过程返回list应该是什么类型
1. 存储过程返回的列表类型是列表(list)。2. 列表类型可以存储一个有序的字符串列表,并支持多种操作,如向列表两端添加元素或获取列表的某个片段。3. 使用LPUSH命令向列表左侧添加元素,返回的值表示添加元素后列表的长度。4. LPUSH命令可以同时添加多个元素。5. 使用RPUSH命令向列表右侧添加元素,返回...
list是什么类型的数据?
1. 列表(List)是一种数据结构,它能够存储一系列有序的项目。在Python中,列表通过方括号[]来表示,其中的项目用逗号分隔。2. 列表的一个主要特点是其可变性,这意味着你可以添加、删除或搜索列表中的元素。这使得列表在需要动态调整数据集合时非常有用。3. 列表可以嵌套,即一个列表可以是另一个...
python list[3::-1]是什么意思
“python list[3::-1]”的意思是:从位置3反向截取list中的数组。list参数分别是截取位置、截取方式。3代表从list第三个位置开始截取,-1代表反向截取。在编程语言中,List是双向串行连接,用于管理线性列中的对象集合。 list的功能是在集合中的任何位置添加或删除元素都是快速的,但不支持随机访问。li...
List集合是什么类型的集合
List集合包括JavaList接口以及List接口的所有实现类。List集合中的元素允许重复,各元素的顺序放是对象插入的顺序,类似Java中的数组,用户可通过使用索引(元素在集合中的位置)来访问集合中的元素。List的最重要的特征就是有序;它会确保以一定的顺序保存元素。List在Collection的基础上添加了大量方法,使之...
Python中的基础数据类型(List,Tuple,Dict)及其常用用法简析
让我们深入探讨Python中的基础数据类型:列表(List)、元组(Tuple)和字典(Dict),了解它们的基本用法。1. 列表(List)列表是用中括号[]表示的,元素之间由逗号分隔。列表非常灵活,可以嵌套任何数据类型,如:列表的取值操作,如:`my_list = [1, 'two', 3.0]`列表的修改,如:`my_list[0] = ...
List<类>是什么理解 和一般的List<对象类型>又有什么区别
概念是一样的,只是 List<类>里面存放的都是类的对象,如List<Person> 放的都是Person对象的引用 List<对象类型>如List<int>存放的是int类型的直接值
说说C#中IList与List区别
1、当使用接口的方法时,ILis<>这种方式比较好。它不获取实现这个接口的类的其它方法和字段,有效的节省空间。2、定义不同:IList<>是个接口,定义了一些操作方法这些方法要自己去实现 List<>是泛型类,它已经实现了IList<>定义的那些方法 1)、IList<Class1>IList11=newList<Class1>()...
lst和list在python中是什么意思
字面意思就是一个集合,在Python中List中的元素用中括号[]来表示,可以这样定义一个List:L=[12,China,1998]可以看到并不要求元素的类型都是一样的。List(列表)是Python中使用最频繁的数据类型。列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(即嵌套)。列表用...
郅胁赛瑞: 建一个struct来保存这4个变量,然后建一个该结构的CList做为CCylinder类的成员.你可以重载[]操作符来取任意位置的薄片信息.
化德县17865512576: VC++6.0,CList<DWORD,DWORD>charlist;是什么意思 - ?
郅胁赛瑞: 用了模板类的缘故,CList<a,b>表示一个类,为了通用,并不在定义时直接指明是用于什么类型的数据,而是用了模板代替,真正声明类对象时,再用所需的类型替代a,b即可,比如这里用了DWORD
化德县17865512576: 关于Clist类的使用?
郅胁赛瑞: 你不能这样去理解,你看看CList的MSDN说明template< class TYPE, class ARG_TYPE = const TYPE& > class CList : public CObject其中第二个类型是const TYPE& 赋值语句,而你如果看了CObject就明白,赋值语句是私有的,所以就会出错,如果你一定要这样用,可以用指针类型typedef CTypedPtrList<CObList,ONE_DEV*> LIST_DEV;//设备链表
化德县17865512576: MFC中CArray和CList模板类的一些问题??
郅胁赛瑞: CArray用于动态数组 CList可以动态添加内容,并显示出来
化德县17865512576: 定义类CList,来管理一个整形的链表,实现问题补充中的功能,哪个好心人能解答,26日九点就得交,帮帮忙...?
郅胁赛瑞: 只不过是类中的内部成员函数外部实现啊,NODE* 表示的返回值类型啊,就跟你代码中的那个函数cList::cList(int n)同一个道理的啊.
化德县17865512576: vc++网络通信编程中用什么来存储一个SOCKET?
郅胁赛瑞: 可以使用CList模板 1、类型定义 typedef CListSOCKET_ARRAY 这种类型等价一个名称SOCKET_ARRAY 2、定义变量 SOCKET_ARRAY m_SocketarrayList; 3、调用CList模板的成员函数 例如:m_SocketarrayList.RemoveAll(); //从列表中移走所有元素 m_SocketarrayList.AddHead(); //添加一个元素到列表标题 关于CList这个类的详细资料,可以参阅MSDN,CObject::CList
化德县17865512576: MFC中CList类声明的ARG - TYPE 参数值的是什么? - ?
郅胁赛瑞: CList类的定义是 template<class TYPE, class ARG_TYPE = const TYPE&> class CList : public CObject 这是个模板类,默认class ARG_TYPE = const TYPE& TYPE是CList存储数据的类型,ARG_TYPE是添加元素时的输入参数类型 比如AddTail的输入参数就是ARG_TYPE类型的
化德县17865512576: 串行化类对象做成员 - ?
郅胁赛瑞: CList用得不对.如果你自定义了一个类,你必须要做两件事: 1)提供一个默认构造函数:sippo() {...} 2)提供一个赋值运算符函数;sippo& operator = (sippo&) {...; return (*this); } 理由是: CList为了将元素保存时(AddTail),它会在内部...
化德县17865512576: 定义一个类CList,来管理一个整形的链表,十万火急,好心人帮帮忙吧 - ?
郅胁赛瑞: #include using namespace std;struct Node{ int num; Node * next;};class CList{private: Node *H; Node *E;public: CList(); vo...
化德县17865512576: VC中使用怎么CList,详细如下 - ?
郅胁赛瑞: CList可以使用结构体,比如 CList<CString ,CString&> list;//链表对象1 CList<CString,CString> list2;//链表对象2 这里的复第一个参数制CString是实例化的类型,第二个参数是类的成员函数的参数的调用形式,通常是类型 引用,当然也可以是对象,而不知是引用.结构体和类的使用方法都一致,C++中类只是C中结构体的延伸而道已.