82 lines
2.5 KiB
C
82 lines
2.5 KiB
C
|
#ifndef DYNAMICSEQLIST_H
|
|||
|
#define DYNAMICSEQLIST_H
|
|||
|
|
|||
|
#include "ArrayList.h"
|
|||
|
#include <initializer_list>
|
|||
|
|
|||
|
namespace Kylin {
|
|||
|
/**
|
|||
|
*Capacity不足时,直接扩容1.5倍
|
|||
|
*/
|
|||
|
template <typename T>
|
|||
|
class DynamicArrayList : public ArrayList<T> {
|
|||
|
public:
|
|||
|
DynamicArrayList() = default;
|
|||
|
DynamicArrayList(size_t capacity) : m_capacity(capacity) {
|
|||
|
this->m_array = new T[m_capacity];
|
|||
|
if (this->m_array == nullptr) THROW_EXCEPTION(NoEnoughMemoryException, "No enough memory to allocate.");
|
|||
|
}
|
|||
|
|
|||
|
DynamicArrayList(std::initializer_list<T> init) {
|
|||
|
this->m_array = new T[init.size()];
|
|||
|
if (this->m_array == nullptr) THROW_EXCEPTION(NoEnoughMemoryException, "No enough memory to allocate.");
|
|||
|
m_capacity = init.size();
|
|||
|
for (auto &value : init) {
|
|||
|
this->m_array[this->m_size++] = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
DynamicArrayList(DynamicArrayList &&other) {
|
|||
|
m_capacity = other.m_capacity;
|
|||
|
this->m_array = other.m_array;
|
|||
|
this->m_size = other.m_size;
|
|||
|
other.m_capacity = 0;
|
|||
|
other.m_size = 0;
|
|||
|
other.m_array = nullptr;
|
|||
|
}
|
|||
|
|
|||
|
DynamicArrayList(const DynamicArrayList &other) {
|
|||
|
this->m_array = new T[other.m_capacity];
|
|||
|
if (this->m_array == nullptr) THROW_EXCEPTION(NoEnoughMemoryException, "No enough memory to allocate.");
|
|||
|
m_capacity = other.m_capacity;
|
|||
|
for (size_t i = 0; i < other.m_size; i++) {
|
|||
|
this->m_array[i] = other.m_array[i];
|
|||
|
this->m_size++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
~DynamicArrayList() {
|
|||
|
if (this->m_array != nullptr) delete[] this->m_array;
|
|||
|
}
|
|||
|
|
|||
|
void insert(size_t index, const T &value) override {
|
|||
|
if (this->m_size >= m_capacity) {
|
|||
|
resize(m_capacity * 2);
|
|||
|
}
|
|||
|
ArrayList<T>::insert(index, value);
|
|||
|
}
|
|||
|
|
|||
|
virtual size_t capacity() const noexcept { return m_capacity; }
|
|||
|
|
|||
|
void resize(size_t capacity) {
|
|||
|
if (capacity == m_capacity) return;
|
|||
|
T *array = new T[capacity];
|
|||
|
if (array == nullptr) {
|
|||
|
THROW_EXCEPTION(NoEnoughMemoryException, "No memory to allocate.");
|
|||
|
}
|
|||
|
size_t size = this->m_size < capacity ? this->m_size : capacity;
|
|||
|
for (size_t i = 0; i < size; i++) {
|
|||
|
array[i] = this->m_array[i];
|
|||
|
}
|
|||
|
this->m_size = size;
|
|||
|
m_capacity = capacity;
|
|||
|
delete[] this->m_array;
|
|||
|
this->m_array = array;
|
|||
|
}
|
|||
|
|
|||
|
private:
|
|||
|
size_t m_capacity = 0;
|
|||
|
};
|
|||
|
} // namespace Kylin
|
|||
|
#endif // DYNAMICSEQLIST_H
|