《C++ primer 》 猎豹网校 模板与泛型编程 2018/10/9

  • 两种模板:类模板、函数模板
  • 泛型编程:   主要用于容器、迭代器、算法-------C++ STL标准模板库
  • 示例:

1,普通队列

2.C++中的泛型队列  

3.顺序队列

4.链式队列

队列——顺序队列   ---系统软件开发,系统的线程池

先进先出(FIFO)或后进后出(LILO)

队首、队尾

队列的操作,push  pop,b

#include 
#include "顺序队列.h"
#include 
using namespace std;

int main()
{
    cout <<"测试顺序队列"< q(5);

    q.Push('A');
    q.Push('B');
    q.Push('C');
    cout <
#ifndef _顺序队列_H
#define _顺序队列_H

#include 
template
class Queue
{
public:
    Queue(int queueCapacity = 10);  //构造函数,默认值为10
    bool IsEmpty() const;           //判断队列是否为空
    T& Front() const;                //查看队首的数据
    T& Rear() const;                   //查看队尾的数据
    void Push(const T& item);
    void Pop();
private:
    T *queue;
    int front;
    int rear;
    int capacity;
};

//构造函数,将缺省值传给初始化列表,capacity
template
Queue::Queue(int queueCapacity):capacity(queueCapacity)
{
    if(capacity < 1) throw "Queue capacity must be >0";
    queue = new   T[capacity];
    front = rear = 0;
}

template
inline bool Queue::IsEmpty() const
{
    return front == rear;   //头和尾的位置相同  即为空
}

template
void Queue::Push(const T &item)
{
//    if(rear == capacity-1)
//        rear = 0;
//    else
//        rear++;
    if((rear+1)%capacity == front) //队列满了
    {
        //加倍
        T* newQueue = new T[2*capacity];
        int start = (front +1) %capacity;
        if(start <2) //没有回转
            copy(queue+start,queue+start+capacity-1,newQueue);
        else
        {
            copy(queue+start,queue+capacity,newQueue);
            copy(queue,queue+rear+1,newQueue+capacity-start);
        }
        front = 2*capacity-1;
        rear = capacity-2;
        capacity *= 2;
        delete[] queue;
        queue = newQueue;

    }
    rear = (rear+1)%capacity; //高水平
    queue[rear] = item;

}

template
inline T& Queue::Front() const
{
    if(IsEmpty()) throw "Queue is empty ,No Front element";
    return queue[(front +1) %capacity];
}

template
inline T& Queue ::Rear() const
{
    if(IsEmpty())   throw "Queue is empty ,no rear element";
    return queue[rear];
}

template
void Queue::Pop()
{
    if(IsEmpty()) throw "Queue is empty .Canot delete.";
    front = (front+1) %capacity;
    queue[front].~T();
}

#endif // _

 

你可能感兴趣的:(语言学习)