顺序表类模板

记录一下自己写的一个顺序表类模板,运算符只重写了[],由于函数中直接用了==运算符,如果模板类的类型是复杂数据类型的话,需要在类中重写==等运算符。

链表类模板

#pragma once

#include <iostream>
using namespace std;

template <typename T>
class List
{
public:
    List(unsigned int size);
    ~List();
    void ClearList();                               //清空表
    bool ListEmpty();                               //判空
    int ListLength();                               //求表长
    bool GetElem(unsigned int i, T *e);             //得到i位置元素
    int LocateElem(T *e);                           //定位
    bool PriorElem(T *currentElem, T *preElem);     //获得指定元素前驱
    bool NextElem(T *currentElem, T *nextElem);     //获得指定元素后继
    void ListTraverse();                            //遍历
    bool ListInsert(unsigned int i, T *e);          //定位插入
    bool ListDelete(unsigned int i, T *e);          //定位删除
public:
    T& operator[](int index);

private:
    T *m_pList;
    unsigned int m_iSize;
    unsigned int m_iLength;
};

template <typename T>
List<T>::List(unsigned int size)
{
    m_iSize = size;
    m_pList = new T[m_iSize];
    m_iLength = 0;
}

template <typename T>
List<T>::~List()
{
    delete[] m_pList;
    m_pList = NULL;
}

template <typename T>
void List<T>::ClearList()
{
    m_iLength = 0;
}

template <typename T>
bool List<T>::ListEmpty()
{
    return 0 == m_iLength;
}

template <typename T>
int List<T>::ListLength()
{
    return m_iLength;
}

template <typename T>
bool List<T>::GetElem(unsigned int i, T *e)
{
    if (i < 0 || m_iSize <= i)
    {
        return false;
    }
    else
    {
        *e = m_pList[i];
        return true;
    }
}

template <typename T>
int List<T>::LocateElem(T *e)
{
    for (unsigned int i = 0; i < m_iLength; ++i)
    {
        if (*e == m_pList[i])
        {
            return i;
        }
    }
    return -1;
}

template <typename T>
bool List<T>::PriorElem(T *currentElem, T *preElem)
{
    int temp = LocateElem(currentElem);
    if (temp == -1)
        return false;
    else
    {
        if (temp == 0)
            return false;
        else
        {
            *preElem = m_pList[temp - 1];
            return true;
        }
    }
}

template <typename T>
bool List<T>::NextElem(T *currentElem, T *nextElem)
{
    unsigned int temp = LocateElem(currentElem);
    if (temp == -1)
        return false;
    else
    {
        if (temp + 1 >= m_iLength)
            return false;
        else
        {
            *nextElem = m_pList[temp + 1];
            return true;
        }
    }
}

template <typename T>
void List<T>::ListTraverse()
{
    for (unsigned int i = 0; i < m_iLength; ++i)
    {
        cout << m_pList[i] << endl;
    }
}

template <typename T>
bool List<T>::ListInsert(unsigned int i, T *e)
{
    if (i < 0 || i > m_iLength)
    {
        return false;
    }
    if (m_iLength >= m_iSize)
    {
        return false;
    }

    for (unsigned int k = m_iLength - 1; m_iLength != 0 && k >= i; k--)
    {
        m_pList[k + 1] = m_pList[k];
    }

    m_pList[i] = *e;
    m_iLength++;
    return true;
}

template <typename T>
bool List<T>::ListDelete(unsigned int i, T *e)
{
    if (i < 0 || i >= m_iLength)
    {
        return false;
    }

    *e = m_pList[i];
    for (unsigned int k = i; k < m_iLength - 1; ++k)
    {
        m_pList[k] = m_pList[k + 1];
    }
    m_iLength--;
    return true;
}


template <typename T>
T& List<T>::operator[](int index)
{
    return *(m_pList + index);
}

模板类型

这里放一个模板的实例,此处还实现了几个运算符的重载。

Person.h

#pragma once

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

class Person
{
    friend ostream &operator<<(ostream &out, Person &person);
public:
    string name;
    string phone;
    Person& operator =(Person &person);
    bool operator == (Person &person);
};

Person.cpp

#include "Person.h"


ostream &operator<<(ostream &out, Person &person)
{
    out << person.name << "----------" << person.phone << endl;
    return out;
}


Person& Person::operator =(Person &person)
{
    this->name = person.name;
    this->phone = person.phone;
    return *this;
}

bool Person::operator == (Person &person)
{
    return (this->name == person.name && this->phone == person.phone);
}
C++中,如果你想创建一个类似于STL `vector`的自定义顺序表类模板,你可以按照以下步骤进行: 首先,你需要定义一个模板类,命名为`CustomSequence`,它有一个动态大小的数组作为存储容器,并提供了一些基本操作,如元素的添加、删除、访问等。这里是一个基础的实现示例: ```cpp template <typename T> class CustomSequence { private: std::size_t capacity; T* elements; // 存储数据的动态数组 public: // 默认构造函数,初始化容量为0,元素指针为空 CustomSequence() : capacity(0), elements(nullptr) {} // 构造函数指定初始容量 CustomSequence(std::size_t initial_capacity = 4) : capacity(initial_capacity), elements(new T[capacity]) {} // 拷贝构造函数,分配足够的空间复制源序列 CustomSequence(const CustomSequence& other) : capacity(other.capacity), elements(new T[capacity]) { for (std::size_t i = 0; i < capacity && i < other.capacity; ++i) { elements[i] = other.elements[i]; } } // 释放内存并清零 ~CustomSequence() { delete[] elements; } // 添加元素到末尾 void push_back(T value) { if (capacity == elements capacity) { resize(capacity * 2); // 当满时,双倍扩容 } elements[capacity++] = value; } // ... 其他成员函数如访问元素、查找、删除等 private: // 扩容函数 void resize(std::size_t new_capacity) { T* new_elements = new T[new_capacity]; for (std::size_t i = 0; i < capacity; ++i) { new_elements[i] = elements[i]; } delete[] elements; elements = new_elements; capacity = new_capacity; } // 禁止直接赋值和拷贝赋值(防止浅拷贝) CustomSequence& operator=(const CustomSequence&) = delete; }; ``` 在这个例子中,我们实现了`push_back`方法来添加元素,以及`resize`方法用于动态调整数组大小。此外,还通过`= delete`禁止了默认的拷贝构造函数和赋值运算符,以防意外的浅拷贝。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值