C++(4):模板类① && STL

一、模板类

1.普通对象调用普通方法;常对象调用常方法

   常对象不能调用普通方法,普通对象可以调用常方法。

例:

将方法编写成常方法,使得通用性提高。即常对象和普通对象都可以调用常方法。

如果类里的成员函数不改变成员状态,则将函数尽可能的设为常方法。

因此在栈中:当取栈顶数据,不会改变栈的状态

Type & top()  //普通对象才能调用的普通方法
{
	return data[pos];
}

const Type &top() const  //常对象才能调用的常方法,且普通对象不能调用
{
	return data[pos];
}

2.失效引用:不要轻易以引用来引用栈里的元素。

//error
int main()
{
	SeqStack<int> ist;
	for(int i=0; i<10; i++)
	{
		ist.push(i+10);
	}

	while(!ist.empty())
	{
		int &a = ist.top();
		ist.pop();     //pop出栈以后
		cout<<a<<endl; //输出的是失效的top
	}
}

主函数运行时,系统控制栈的获取和释放,程序员控制堆区的获取和释放。

3.

(1)禁止使用new为容器开辟空间。因为当type是我们自己设计的类型时,不但要开辟空间,还要调动构造函数。

//构造函数
SeqStack(int sz = 100):data(NULL),capacity(sz),pos(-1)
{
	//data = new Type[capacity];
	data = (Type*)malloc(sizeof(Type)*capacity);
}

(2) C++中只能是对象对对象赋值。不能对空间赋值,而是调动构造函数在空间中构建一个对象。

void push(const Type &x) 
{
        //data[++pos] = x;
	new(&data[++pos]) Type(x);
}

(3)改写:

void pop()
{
	(&data[pos])->~Type();
	--pos;
}

~SeqStack()
{
	for(int i = 0;i<=top;++i)
	{
		(&data[i])->~Type();  //先把对象的资源释放掉
	}
	free(data);  //再把空间释放掉
	data = NULL;
	capacity = 0;
	pos = -1;
}

以上为真正意义上的栈。

4.

template<class Type>
class SeqStack
{
private:
	Type *data;
	int  capacity;
	int  pos;
public:
};

int main()
{
	SeqStack<object> objst;
	//sizeof(object) = 12 Byte;
	Object obj(10);
	objst.push(obj);  //向堆区入空间,obj的大小不会变
	//sizeof(objst) = 12 Byte;
}

二、标准模板库STL

1.容器类是管理序列的类,是容纳一组对象或对象集的类。容器就是能够容纳其他对象的对象

   迭代子是面向对象版本的指针,它提供了访问容器或序列中每个对象的方法。

在STL中,vector相当于一个动态数组

int main()
{
	vector<int> ar = {12,23,34,4,5,5,6,4}; //定义一个一维数组
	vector<int> :: iterator it = ar.begin();
	for(; it != ar.end(); it++)
	{
		cout << *it <<endl;
	}
        ar.push_back(100); //可以直接尾部插入

        //vector<vector<int>> ar //还可以定义一个二维数组

	return 0;
}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值