📅  最后修改于: 2023-12-03 14:53:35.827000             🧑  作者: Mango
C++中的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;
};
构造函数需要检查初始容量是否为负数或者为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;
}
析构函数需要释放动态分配的内存空间。
template<class T>
arrayList<T>::~arrayList() {
delete[] element;
}
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;
}
get函数可以返回指定位置的元素,需要检查索引是否越界。
template<class T>
T& arrayList<T>::get(int index) const {
checkIndex(index);
return element[index];
}
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;
}
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;
}
output函数可以打印输出当前arrayList中所有元素的值。
template<class T>
void arrayList<T>::output(std::ostream& out) const {
for (int i = 0; i < listSize; ++i) {
out << element[i] << " ";
}
}
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等容器。