一、模板类
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;
}