📜  定义并展示 arrayList 函数的实现. - C++ (1)

📅  最后修改于: 2023-12-03 14:53:35.827000             🧑  作者: Mango

C++中的arrayList函数

C++中的arrayList函数是一种可以存储任意类型数据的线性容器,其内部实现使用动态数组作为存储介质,可以进行高效的插入、删除、查找等操作。

arrayList的定义

arrayList的定义需要包括其头文件,以及声明一个arrayList类。

#include <iostream>
#include <stdexcept>

template<class T>
class arrayList {
public:
    // 构造函数、析构函数
    arrayList(int initialCapacity = 10);
    arrayList(const arrayList<T>& List);
    ~arrayList();

    // 公有成员函数
    bool empty() const;
    int size() const;
    T& get(int index) const;
    int indexOf(const T& element) const;
    void erase(int index);
    void insert(int index, const T& element);
    void output(std::ostream& out) const;

private:
    // 私有成员变量
    int capacity; // 数组的容量(即分配的空间)
    int listSize; // 数组中实际元素的数量
    T* element; // 指向存储元素的数组

    // 私有成员函数
    void checkIndex(int index) const;
};
实现arrayList的构造函数

构造函数需要检查初始容量是否为负数或者为0,并根据情况分配对应的内存空间。

template<class T>
arrayList<T>::arrayList(int initialCapacity) {
    if (initialCapacity <= 0) {
        std::ostringstream s;
        s << "Initial capacity = " << initialCapacity << " Must be > 0";
        throw std::invalid_argument(s.str());
    }
    capacity = initialCapacity;
    element = new T[capacity];
    listSize = 0;
}
实现arrayList的析构函数

析构函数需要释放动态分配的内存空间。

template<class T>
arrayList<T>::~arrayList() {
    delete[] element;
}
实现arrayList的empty和size函数

empty函数可以判断当前arrayList是否为空,size函数可以返回当前arrayList中元素的数量。

template<class T>
bool arrayList<T>::empty() const {
    return listSize == 0;
}

template<class T>
int arrayList<T>::size() const {
    return listSize;
}
实现arrayList的get函数

get函数可以返回指定位置的元素,需要检查索引是否越界。

template<class T>
T& arrayList<T>::get(int index) const {
    checkIndex(index);
    return element[index];
}
实现arrayList的indexOf函数

indexOf函数可以返回某个元素的位置,需要遍历整个arrayList来寻找对应元素的位置。

template<class T>
int arrayList<T>::indexOf(const T& element) const {
    for (int i = 0; i < listSize; ++i) {
        if (this->element[i] == element) {
            return i;
        }
    }
    return -1;
}
实现arrayList的erase和insert函数

erase函数可以删除指定位置的元素,insert函数可以在指定位置插入一个元素,需要检查索引是否越界。

template<class T>
void arrayList<T>::erase(int index) {
    checkIndex(index);
    for (int i = index; i < listSize - 1; ++i) {
        element[i] = element[i + 1];
    }
    element[--listSize].~T();
}

template<class T>
void arrayList<T>::insert(int index, const T& element) {
    if (index < 0 || index > listSize) {
        std::ostringstream s;
        s << "Index = " << index << " Size = " << listSize;
        throw std::out_of_range(s.str());
    }
    if (listSize == capacity) {
        T* old = this->element;
        capacity *= 2;
        this->element = new T[capacity];
        for (int i = 0; i < index; ++i) {
            this->element[i] = old[i];
        }
        for (int i = listSize - 1; i >= index; --i) {
            this->element[i + 1] = old[i];
        }
        delete[] old;
    } else {
        for (int i = listSize - 1; i >= index; --i) {
            element[i + 1] = element[i];
        }
    }
    element[index] = element;
    ++listSize;
}
实现arrayList的output函数

output函数可以打印输出当前arrayList中所有元素的值。

template<class T>
void arrayList<T>::output(std::ostream& out) const {
    for (int i = 0; i < listSize; ++i) {
        out << element[i] << " ";
    }
}
实现arrayList的checkIndex函数

checkIndex函数可以检查数组索引是否越界,如果越界就抛出异常。

template<class T>
void arrayList<T>::checkIndex(int index) const {
    if (index < 0 || index >= listSize) {
        std::ostringstream s;
        s << "Index = " << index << " Size = " << listSize;
        throw std::out_of_range(s.str());
    }
}
结论

以上就是C++中arrayList函数的实现,它提供了基本的插入、删除、查找等操作,可以灵活地存储各种类型的数据。如果需要更加高级的容器,可以考虑使用STL中提供的vector、list等容器。