C++ template--类模版Stack的实现

类模版Stack的实现

//stack1.hpp
#include<vector>
#include<stdexcept>
using namespace std;

template <typename T>
class Stack
{
private:
	vector<T> elems;
public:
	void push(T const&);
	void pop();
	T top() const;
	bool empty() const
	{
		return elems.empty();
	}
};

template <typename T>
void Stack<T>::push(T const &elem)
{
	elems.push_back(elem);//vector里面最后添加一个,即栈顶添加一个元素
}

template <typename T>
void Stack<T>::pop()
{
	if(elems.empty())
	{
		throw out_of_range("Stack<>::pop():empty stack");
	}
	elems.pop_back();//vector里面移除最后一个元素,即移除栈顶元素
}

template <typename T>
T Stack<T>::top() const
{
	if(elems.empty())
	{
		throw out_of_range("Stack<>::top():empty stack");
	}
	return elems.back();//vector里面返回最末一个元素,即stack里面的栈顶元素
}

可以看出,类模版Stack<>是通过C++标准库的类模版vector<>来实现的,因此,我们不需要亲自去实现内存管理,拷贝构造函数和赋值运算符,从而可以把精力放在该模板类的接口实现上。

//main.cpp
//类模版Stack实现
#include<iostream>
#include<string>
#include<vector>
#include"stack1.hpp"

using namespace std;

int main()
{
	Stack<int>  intStack;

	//使用int桟
	cout<<"使用int桟"<<endl;
	for(int i=1;i<6;i++)
	intStack.push(i);

	while(!intStack.empty())
	{
		cout<<intStack.top()<<" ";
		intStack.pop();
	}
	cout<<endl;

	Stack<string> stringStack;
	cout<<"请输入string(#退出):";
	string str;
	while(cin>>str)
	{
		if(str=="#")
			break;
		stringStack.push(str);
	}

	while(!stringStack.empty())
	{
		cout<<stringStack.top()<<" ";
		stringStack.pop();
	}
	cout<<endl;

	system("pause");
	return 0;
}

通过声明类型Stack<int>,在类模版内部就可以用int实例化T,因此,intSatck是一个创建自Stack<int>的对象,它的元素储存于vector,且为int。

对于所有被调用的成员函数,都会实例化出基于int类型的函数代码。

注意:只有那些被调用的成员函数,才会产生这些函数的实例化代码。对于类模版,成员函数只有在被使用的时候才会被实例化。

时间: 2024-10-11 23:20:47

C++ template--类模版Stack的实现的相关文章

C++ 类模板三(类模版中的static关键字)

//类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器在利用类模板生成类的时候会为每个类生成一个static变量 那么对于类中的static关键字就非常好理解了 static关键字修饰的变量是属于类的 同一个类的对象共享类的static静态变量 类模板中的static修饰的变量数据类型必须是确定的 不可以是类型参数 因为静态变量在类对象之前初始化 这时候还没有通

C++ 类模板二(类模版与友元函数)

//类模版与友元函数 #include<iostream> using namespace std; template<typename T> class Complex{ public: Complex(T a,T b); void Print() const//const修饰的是this指针 { cout << this->Real << ":" <<this->Image<< endl; } /*

浅析在类模版中构建成员函数时,使用memcpy产生的副作用

一般情况下我们在对类模版中的成员函数进行构建时会经常对一些数据进行复制拷贝,而通常情况下我们都不提倡用memcpy进行拷贝,因为在类模版中所传进来的类型可以是内置类型也可以是非内置类型,除非你在成员函数中使用memcpy前进行类型萃取,否则它所带来的副作用的后果也是很可怕的.memcpy在对内置类型可正常拷贝,而在对非内置类型拷贝时会出现浅拷贝的现象. 下面我们可以通过一个简单的顺序表程序来分析memcpy对非内置类型所产生的副作用: #include<iostream> #include&l

初探C++类模版学习笔记

类模板 实现:在定义类的时候给它一个或多个参数,这个些参数表示不同的数据类型.                              -->抽象的类. 在调用类模板时, 指定参数, 由编译系统根据参数提供的数据类型自动产生相应的模板类                   -->具体的类. 类模板的定义 C++的类模板的写法如下: template <类型参数表> //类型参数表的写法就是:class 类型参数1, class 类型参数2, - class 类模板名 { 成员函数

c++ 类模版、成员函数模版、函数模版 用法

C++函数模版与类模版. template <class T> void SwapFunction(T &first, T &second){ }//函数模版 template <class T>//类模版 class CTemplate{ public: void SWap(T &first, T &second){ } }; #include <iostream> class Single{ public: static Single

类模版静态成员初始化

首先看代码,静态数据成员分为两种情况,第一种不依赖模版类型参数,第二种依赖模版类型参数. template <typename T> class TestTemStatic { public: static int knownTypeVar; static T unKnownTypeVar; }; 那么如何初始化呢? 对于第一种存在两种初始化方式: template <> int TestTemStatic<int/* any other type */>::known

3.1.2 函数模版与类模版

一.函数模版 比较两个数的大小. 代码: #include <iostream> using namespace std; template <typename T> inline int myCompare(const T &a, const T &b) { if(a > b) return 1; else if(a < b) return -1; else return 0; } int main() { cout << myCompar

第2章 类模板:2.1 类模板Stack的实现

Chapter 2: Class Templates 第2章 类模板 Similar to functions, classes can also be parameterized with one or more types. Container classes, which are used to manage elements of a certain type, are a typical example of this feature. By using class templates

C#常用的集合类型(ArrayList类、Stack类、Queue类、Hashtable类、SortedList类)

1.ArrayList类 ArrayList类主要用于对一个数组中的元素进行各种处理.在ArrayList中主要使用Add.Remove.RemoveAt.Insert四个方法对栈进行操作.Add方法用于将对象添加到 ArrayList 的结尾处:Remove方法用于从 ArrayList 中移除特定对象的第一个匹配项:RemoveAt方法用于移除 ArrayList 的指定索引处的元素:Insert方法用于将元素插入 ArrayList 的指定索引处. 示例 ArrayList的使用 示例将介