• 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”

    编程学习书籍:


     

    编程学习视频:


     
  • 相关阅读:
    WCF 转 武胜
    NET(C#):GetHashCode不需要太复杂 转 武胜
    wcf KnownTypeAttribute 武胜
    memmove
    李开复谈创业失败十原因:经不住诱惑 直接山寨
    Linux使用Wine 安装source insight
    VM 中ubuntu下Eclipse ctrl+s 显示update conflict的问题
    ISO/OSI模型
    memset函数使用详解
    C语言中字符串的处理方式
  • 原文地址:https://www.cnblogs.com/mu-ge/p/14005471.html
Copyright © 2020-2023  润新知