C++基础总结(六):C++进阶——模板和STL入门

今天小编分享 C++ 模板和STL入门 ,建议大家收藏慢慢学习,同时希望对大家的C++学习有所帮助。


 

C++ 模板

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。

模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。

每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector <int> 或 vector <string>。

您可以使用模板来定义函数和类,接下来让我们一起来看看如何使用。

函数模板

模板函数定义的一般形式如下所示:

template<class type> ret - type func - name ( parameter list ) { // 函数的主体  }

在这里,type 是函数所使用的数据类型的占位符名称。这个名称可以在函数定义中使用。

下面是函数模板的实例,返回两个数中的最大值:

实例

#include<iostream>#include<string>using namespace std;

template<type name T>inline T const & Max ( T const & a,T const & b) {

return a<b?b:a;} int main(){

int i=39;

int j=20;

cout<<"Max(i, j): "<<Max(i,j)<<endl;

double f1=13.5;

double f2=20.7;

cout<<"Max(f1, f2): "<<Max(f1,f2)<<endl;

string s1="Hello";

string s2="World";

cout<<"Max(s1, s2): "<<Max(s1,s2)<<endl;

return0;}

当上面的代码被编译和执行时,它会产生下列结果:

Max(i,j):39 Max (f1,f2):20.7 Max( s1,s2):World类模板

正如我们定义函数模板一样,我们也可以定义类模板。泛型类声明的一般形式如下所示:

template<class type>class class-name{...}

在这里,type 是占位符类型名称,可以在类被实例化的时候进行指定。您可以使用一个逗号分隔的列表来定义多个泛型数据类型。

下面的实例定义了类 Stack<>,并实现了泛型方法来对元素进行入栈出栈操作:

实例

#include<iostream>#include<vector>#include<cstdlib>#include<string>#include<stdexcept>using namespace std;

template<classT>classStack{

private:

vector<T>elems;

// 元素 

 public: 

 void push(T const&); 

 // 入栈 

 void pop(); 

 // 出栈 

 T top() const; 

 // 返回栈顶元素 

 bool empty() const{ 

 // 如果为空则返回真。 

 return elems.empty(); 

 } }; 

 template <class T>void Stack<T>::push (T const& elem) { 

 // 追加传入元素的副本 

 elems.push_back(elem);

 } 

 template <class T>void Stack<T>::pop () { 

 if (elems.empty()) { 

 throw out_of_range("Stack<>::pop(): empty stack"); 

 }

 // 删除最后一个元素

elems.pop_back();

 }  template <class T>T Stack<T>::top () const {

 if (elems.empty()) {

 throw out_of_range("Stack<>::top(): empty stack");

 } 

 // 返回最后一个元素的副本

 return elems.back(); 

 }  int main() { 

 try { 

 Stack<int> int

Stack; // int 类型的栈 

 Stack<string> string Stack; 

 // string 类型的栈 

 // 操作 int 类型的栈

 int Stack.push(7); 

 cout << int Stack.top() <<endl; 

 // 操作 string 类型的栈 

 string Stack.push("hello"); 

 cout << string Stack.top() << std::endl; 

 string Stack.pop(); 

 string Stack.pop(); 

 } 

 catch (exception const& ex) {

 cerr << "Exception: " << ex.what() <<endl; 

 return -1;

 } }

当上面的代码被编译和执行时,它会产生下列结果:

7 hello Exception:Stack<>::pop():empty stack

 


 

C++ STL 入门

上面我们已经了解了 C++ 模板的概念。C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

C++ 标准模板库的核心包括以下三个组件:

组件


 

这三个组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务。

下面的程序演示了向量容器(一个 C++ 标准的模板),它与数组十分相似,唯一不同的是,向量在需要扩展大小的时候,会自动处理它自己的存储需求:

实例

#include<iostream>#include<vector>using namespace std;int main(){

// 创建一个向量存储 int 

 vector<int> vec; 

 int i;

 // 显示 vec 的原始大小 

 cout << "vector size = " << vec.size() << endl; 

 // 推入 5 个值到向量中 

 for(i = 0; i < 5; i++){ 

 vec.push_back(i); 

 } 

 // 显示 vec 扩展后的大小 

 cout << "extended vector size = " << vec.size() << endl; 

 // 访问向量中的 5 个值 

 for(i = 0; i < 5; i++){

 cout << "value of vec [" << i << "] = " << vec[i] << endl; 

 }

 // 使用迭代器 iterator 访问值 

 vector<int>::iterator v = vec.begin(); 

 while( v != vec.end()) { 

 cout << "value of v = " << *v << endl;

 v++; 

 } 

 return 0;}

当上面的代码被编译和执行时,它会产生下列结果:

vector size=0extended vector size=5value of vec[0]=0value of vec[1]=1value of vec[2]=2value of vec[3]=3value of vec[4]=4value of v=0value of v=1value of v=2value of v=3value of v=4


 

关于上面实例中所使用的各种函数,有几点要注意:

push_back( ) 成员函数在向量的末尾插入值,如果有必要会扩展向量的大小。

size( ) 函数显示向量的大小。

begin( ) 函数返回一个指向向量开头的迭代器。

end( ) 函数返回一个指向向量末尾的迭代器。

好了,以上就是对 C++模板和STL入门的分享。

如果你喜欢这篇文章的话,动动小指,加个关注哦~


 

如果你也想成为程序员,想要快速掌握编程,这里为你分享一个学习企鹅圈子!

里面有资深专业软件开发工程师,在线解答你的所有疑惑~C++入门“so easy”

编程学习书籍:


 

编程学习视频:


 
原文地址:https://www.cnblogs.com/mu-ge/p/14005471.html