1. 程式人生 > 其它 >C++11自定義實現vector

C++11自定義實現vector

技術標籤:C++基礎總結stlc++

C++11自定義實現vector

如果有錯誤歡迎大家指出。

  1. 不是標準答案!!!
  2. 模板類所有內容都在標頭檔案定義。
  3. 資料成員為連續記憶體首 t,元素數量size,已分配空間len。
  4. 支援移動使用移動。
#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