第10章 范型和容器

1。解释模版参数与函数参数之间的一个重要区别?
    模板参数不仅可以传递变量和值,还可以传递类型表达式。
    template <class T> T power (T a, int exp){
        T ans = a;
         while (--exp > 0){
             ans *= a;
         }
         return (ans);
    }

    [temp-demo.cpp]
    int main(){
        Complex z(3,4),zl;
        Fraction f(5,6),f1;
        int n(19);

        z1 = power(z,3);/*第1次实例化*/
        f1 = power(f,4);/*第2次实例化*/
        z1 = power<Complex>(n,4); 
        z1 = power(n,5);
    }
2。实例化某个模版函数意味着什么?描述一种实例化的方法。
    每当编译器首次识别出使用一个组特定的参数类型来调用模板函数时,就称此模板进行了实例化。
3。通常来说需要将模板定义放在头文件中,这是为什么?
    这是因为编译器需要这些定义来根据模板声名生成代码。同样也要注意所需要的声明代码:template<class T>这些代码必须出现在任何在名字中使用

此模板参数的类或者函数的定义之前。
4。QT容器类用来存储值类型。哪种事物不适与使用值集合中的值进行存储?
5。哪种容器提供从键到值的映射?至少列举两种,然后讲述他们之间的区别。
    QMap:是一个存储键-值对的,有序的关联容器,主要设计用来快速查找与某个键关联的值以及简化插入操作。
    QHash:是一个使用哈希表来加快键的查找的关联容器。它提供了非常快速的查找和插入操作。但是搜索速度较慢,也没有进行分类。
6。一个容器管理其堆对象的含义是什么?一个包含堆对象指针的容器怎样变成“管理容器”?
    对于QT的指针容器,可以使用qDeleteALL(container)这个算法来调用容器内所有元素的delete操作。
    当一个容器对其中的对象仅仅提供索引或引用导航机制的时候,称此容器为聚合容器,它仅仅复制容器中的对象的引用。当删除聚合容器时,也仅仅移

除其引用,这对容器底层毫无影响。

stack.
----------------------------------------------------
#include <qstd.h>
template <class T>class Node {
public:
    Node(T invalue): m_Value(invalue), m_Next(0){}
    ~Node();
    T getValue() const {return m_Value; }
    void setValue(T value){m_Value = value;}
    Node<T>* getNext() const {return m_Next;}
    void setNext(Node<T>* next){m_Next = next;}
private:
    T m_Value;
    Node<T>* m_Next;
};

template <class T> Node<T>::~Node(){
    using namespace qstd;
    cout << m_Value << "deleted" << endl;
    if (m_Next){
        delete m_Next;
    }
}

template <class T> class Stack {
public:
    Stack(): m_Head(0),m_Count(0){}
    ~Stack<T>() {delete m_Head;};
    void Push(const T& t);
    T pop();
    T top() cosnt;
    int count() const;
private:
    Node<T>*  m_Head;
    int m_Count;
};


template <class T> void Stack<T>::push(const T& value) {
    Node<T> *newNode = new Node<T>(value);
    newNode->setNext(m_Head);
    m_Head = newNode;
    ++m_Count;
}

template <class T> T Stack<T>::pop() {
    Node<T> *popped = m_Head;
    if (0 != m_Head){
        m_Head = m_Head->getNext();
        T retval = popped->getValue();
        popped->setNext(0);
        delete popped;
        --m_Count;
        return retval;
    }
    return 0;
}

main.cpp
---------------
#include <QDebug>
#include <QString>
#include "stack.h"

int main(){
    Stack<int> intstack1, intstack2;
    int val;
    for (val = 0; val < 4; ++val){
        intstack1.push(val);
        intstack2.push(2 * val);
    }

    while (intstack.count()){
        val = intstack1.pop;
        qDebug() << val;
    }
    Stack<QString> stringstack;
    stringstack.push("FIRST ON");
    stringstack.push("SECOND ON");
    stringstack.push("FIRST OFF");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的横打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值