myvector.h
#pragma once
#include<assert.h>
#include<iostream>
#include<vector>
using namespace std;
namespace bit {template<class T>//必須使用typename場景\template<typename T>與template<class T>一般情況下這兩個通用,但有一個特例,就是當 T 是一個類,而這個類又有子類(假設名為 innerClass) 時,應該用 template<typename>:\typename T::innerClass myInnerObject; 這里的 typename 告訴編譯器,T::innerClass 是一個類,程序要聲明一個 T::innerClass 類的對象,而不是聲明 T 的靜態成員,而 typename 如果換成 class 則語法錯誤。class vector{public:typedef T* iterator;typedef const T* const_iterator;//const指針得到const迭代器,非const得非const迭代器const_iterator begin()const{return _start;}const_iterator end()const{return _end;}iterator begin(){return _start;}iterator end(){return _end;}// 類模板的成員函數
// 函數模板 -- 目的支持任意容器的迭代器區間初始化template<class InputIterator>vector(InputIterator it_begin, InputIterator it_end){while (it_begin != it_end){push_back(*(it_begin++));}}vector() = default;vector(size_t n, const T& val = T()){reserve(n);//盡量一次性開空間for (size_t i = 0; i < n; i++)//和n同一類型大小push_back(val);}vector(initializer_list<T> il){reserve(il.size());//要push_back,insert等頻繁插入數據就想優化一次插入for (auto& e : il)//初始列表支持迭代器就支持范圍for從頭往后{push_back(e);}}vector(int n, const T& val = T())//要有int版本的不然傳兩個數字為int與迭代器模板函數混淆{reserve(n);//盡量一次性開空間for (int i = 0; i < n; i++)//和n同一類型大小push_back(val);}vector(const vector<T>& v){//拷貝構造實現深度拷貝reserve(v.capacity());for (auto& e : v){push_back(e);}}void swap(vector<T>&v){std::swap(this->_start, v._start);std::swap(this->_end, v._end);std::swap(this->_end_of_storage, v._end_of_storage);}vector<T>& operator=(vector<T> v)//現代寫法,可以傳參的拷貝實參,深拷貝再交換自動析構{swap(v);return *this;//可以連續運算的返回其值}~vector(){if (_start){delete[] _start;_start = _end_of_storage = _end = nullptr;}}void reserve(size_t n)//size_t{//不能用memcpy拷貝新舊空間,淺拷貝的空間會析構兩次if (n > capacity()){size_t oldsizes = size();iterator new_start = new T[n];for (size_t i = 0; i < oldsizes; i++){new_start[i] = _start[i];}delete[] _start;_start = new_start;_end = _start + oldsizes;_end_of_storage = _start+n;}}size_t capacity()const //僅訪問的允許常this指針{return _end_of_storage - _start;}size_t size()const{return _end - _start;}T& operator[](size_t n){assert(n < size());//訪問越界檢查return _start[n];}const T& operator[](size_t n)const//常指針訪問返回常引用[]{assert(n < this->size());return _start[n];}void push_back(const T& val){//if (_end == _end_of_storage)//{// size_t capacity = capacity() == 0 ? 4 : 2 * capacity();// reserve(capacity);//}//*_end++ = val;//后置++優先級大于解引用insert(end(), val);}void popback(){assert(size());--_end;}iterator insert(iterator pos, const T& val)//pos迭代器不能傳引用,不然外部不能拷貝傳參臨時變量引用,insert(t.begin()->傳的臨時變量不能傳普通引用{//這里形參如果是引用的話,則編譯時會報錯,因為v.begin()返回的是一個臨時變量,自定義類型傳值拷貝返回,返回臨時變量再拷貝給接收的,是一個右值,它不能賦值給一個非const的引用: assert(pos <= _end);assert(pos >= _start);if (_end == _end_of_storage){size_t len = pos - _start;size_t capacity = this->capacity() == 0 ? 4 : this->capacity() * 2;reserve(capacity);pos = _start + len;//內部迭代器更新}iterator end = _end-1;while (end >= pos){*(end + 1)=*end;end--;}_end++;*pos = val;return pos;}iterator erase(iterator pos){assert(pos < _end);assert(pos >= _start);iterator pos_i = pos+1;while (pos_i < _end)*(pos_i - 1) = *pos_i++;--_end;return pos;}private://在類型定義后寫iterator _start = nullptr;iterator _end = nullptr;iterator _end_of_storage = nullptr;};
}
void test01()
{bit::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);size_t size = v1.size();for (int i = 0; i < size; i++)cout << v1[i] << endl;for (const auto& e : v1)cout << e << endl;bit::vector<int>::iterator it_begin = v1.begin();bit::vector<int>::iterator it_end = v1.end();for (; it_begin < it_end; it_begin++)cout << *it_begin << endl;}void test02()
{bit::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);v1.insert(v1.begin(), 0);size_t size = v1.size();for (int i = 0; i < size; i++)cout << v1[i] << " ";cout << endl;for (const auto& e : v1)cout << e << " ";cout << endl;v1.erase(v1.end() - 1);bit::vector<int>::iterator it_begin = v1.begin();bit::vector<int>::iterator it_end = v1.end();for (; it_begin < it_end; it_begin++)cout << *it_begin << " ";cout << endl;int x;cin >> x;bit::vector<int>::iterator pos_x = find(v1.begin(), v1.end(), x);//模板實例化才能找類域if (pos_x != v1.end()){pos_x =v1.insert(pos_x, 1000);// 建議失效后迭代器不要訪問。除非賦值 更新 一下這個失效的迭代器cout << *pos_x << endl;}for (const auto& e : v1)cout << e << " ";cout << endl;}
void test03()
{std::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);int x;cin >> x;std::vector<int>::iterator it = find(v1.begin(), v1.end(), x);if (it != v1.end()){// erase it以后,it是否失效呢?失效it = v1.erase(it);if (it != v1.end())cout << *it << endl;}cout << typeid(it).name() << endl;
}
void test_vector4()
{std::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);std::vector<int>::iterator it = v1.begin();while (it < v1.end())//用迭代器遍歷并刪除偶數{if (*it % 2 == 0){it = v1.erase(it);}else++it;}for (auto e : v1){cout << e << " ";}cout << endl;
}
void test_vector5()
{bit::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);bit::vector<int> v2(v1);for (auto e : v2){cout << e << " ";}cout << endl;bit::vector<int> v3;v3.push_back(10);v3.push_back(20);v3.push_back(30);v1 = v3;for (auto e : v1){cout << e << " ";}cout << endl;
}
void test_vector07()
{int i = int();int k(2);int f = { 3 };int h = int(7);int j{ 1 };
}