C++11自定義實現vector
阿新 • • 發佈:2020-12-18
C++11自定義實現vector
如果有錯誤歡迎大家指出。
- 不是標準答案!!!
- 模板類所有內容都在標頭檔案定義。
- 資料成員為連續記憶體首 t,元素數量size,已分配空間len。
- 支援移動使用移動。
#ifndef MYVECTOR_H
#define MYVECTOR_H
#include<memory>
#include "myIterator.h"
template<class T>
class myVector
{
public:
typedef T value_type;
//typedef Iterator<T> Iterator;
typedef T* Iterator;
myVector();
myVector(const Iterator beg, const Iterator end);
myVector(const int n);
myVector(const myVector& a);
~myVector();
Iterator begin() const;
Iterator end() const;
int size() const;
int capacity() const;
void reserve( const int newCapacity);
void push_back(const T& v);
void pop_back();
T& back();
bool empty() const;
T& operator[](int i) const;
Iterator insert(Iterator pos, const T& val);
Iterator erase(Iterator pos);
void clear();
private:
T* t_;
int size_;
int len_;
};
template<class T>
myVector<T>::myVector() :t_(nullptr), size_(0), len_(0)
{
}
template<class T>
myVector<T>::myVector(const Iterator beg, const Iterator end)
{
size_ = end - beg;
len_ = (size_ + 4) / 4 * 4;
std::allocator<T> arr;
t_ = arr.allocate(len_);
for (int k = 0; k < size_; ++k)
{
new(&t_[k])T(*beg);
++beg;
}
}
template<class T>
myVector<T>::myVector(const int n)
{
size_ = n;
len_ = (size_ + 4) / 4 * 4;
t_ = new T[len_]; //如果T沒有預設建構函式,這裡出錯。標準庫是丟擲異常
}
template<class T>
myVector<T>::myVector(const myVector& a)
{
size_ = a.size_;
len_ = a.len_;
std::allocator<T> arr;
t_ = arr.allocate(len_);
for (int k = 0; k < size_; ++k)
{
new(&t_[k])T(a[k]);
}
}
template<class T>
myVector<T>::~myVector()
{
if (t_){
for(int i=0;i<size_;i++)
(*(t_+i)).~T();
free(t_);
t_=nullptr;
size_ =0;
len_ = 0;
}
}
template<class T>
typename myVector<T>::Iterator myVector<T>::begin()const
{
return t_;
}
template<class T>
typename myVector<T>::Iterator myVector<T>::end()const
{
return t_ + size_;
}
template<class T>
int myVector<T>::size()const
{
return size_;
}
template<class T>
int myVector<T>::capacity()const
{
return len_;
}
template<class T>
bool myVector<T>::empty()const
{
return size_ == 0;
}
template<class T>
T& myVector<T>::operator[](int i) const
{
return t_[i];
}
template<class T>
void myVector<T>::reserve(const int newCapacity)
{
if (newCapacity <= len_)
return;
else
len_ = (len_+4)/4*4*2;;
std::allocator<T> arr;
T *newArray = arr.allocate(len_);
for (int k = 0; k < size_; ++k)
new(&newArray[k])T(std::move_if_noexcept(t_[k]));
for (int k = 0; k < size_; ++k)
t_[k].~T();
free(t_);
t_ = newArray;
}
template<class T>
void myVector<T>::push_back(const T& v)
{
insert(end(), v);
}
template<class T>
void myVector<T>::pop_back()
{
t_[size_ - 1].~T();
size_ = size_ - 1;
}
template<class T>
T& myVector<T>::back()
{
return t_[size_ - 1];
}
template<class T>
typename myVector<T>::Iterator myVector<T>::insert(Iterator pos, const T& val)
{
int temSize = size_ + 1;
unsigned int dis = pos-begin();
reserve(temSize);
for ( unsigned int i = size_; i >dis; i--)
{
t_[i] =std::move_if_noexcept( t_[i - 1]) ;
}
t_[dis] = val;
size_ = size_+1;
return begin()+dis;
}
template<class T>
typename myVector<T>::Iterator myVector<T>::erase(Iterator pos)
{
for (int i = pos; i < size_ - 1; i++)
{
t_[i] = std::move_if_noexcept(t_[i + 1]);
}
size_ = size_ - 1;
return t_ + pos;
}
template<class T>
void myVector<T>::clear()
{
~myVector();
}
#endif // MYVECTOR_H