#include<iostream>
#include<vector>
#include<algorithm>
#include<stdlib.h>
#include"myvector.h"
using namespace std;
void VectorTest()
{
vector<int> vec;
int count = 0;
for (int i = 0; i < 1000000; i++)
{
vec.push_back(0);
int size = vec.size();
int capacity = vec.capacity();
if (size == capacity)
{
cout << size << "\t" << capacity << endl;
count++;
}
}
cout << count << endl;
}
int main()
{
vector<int> vec1;
vector<int> vec2(7);
vector<int> vec3(5, 2);
vector<int> vec4(vec3);
CMyVector<int> vec8(20,12);
CMyVector<int> vec9(20,11);
bool dayu1 = vec8 > (vec9);
bool dayu2 = vec8 >= (vec9);
bool dayu3 = vec8 < (vec9);
bool dayu4 = vec8 <= (vec9);
cout << "vector初始化:";
int arr[] = { 1, 2, 3, 4, 5 };
for (auto i : arr)
{
cout << i << " ";
}
cout << endl << endl;
vector<int> vec5(arr, arr + 5);
vector<int> vec6(&arr[0], &arr[4]);
vec1.push_back(10);
vec1.push_back(20);
vec1.push_back(30);
vec1.pop_back();
cout << "迭代器的:";
cout << *vec1.begin() << " ";
cout << *(vec1.end() - 1) << endl;
cout << endl;
cout << "vector访问方法:";
vec1[1] = 90;
vec1.at(0) = 80;
vec1.cbegin(), vec1.cend();
cout << vec1.front() << " ";
cout << vec1.back() << endl;
int *p = vec1.data();
vec1.clear();
cout << endl;
for (int i = 0; i < 10; ++i)
{
vec1.push_back(i);
}
cout << "遍历输出:";
vector<int>::iterator it;
for (it = vec1.begin(); it != vec1.end(); ++it)
{
cout << *it << " ";
}
cout << endl << endl;
cout << "元素个数:" << vec1.size() << endl << endl;
cout << "翻转后:";
reverse(vec1.begin(), vec1.end());
for (auto i : vec1)
{
cout << i << " ";
}
cout << endl << endl;
cout << "排序后:";
sort(vec1.begin(), vec1.end());
for (auto i : vec1)
{
cout << i << " ";
}
cout << endl << endl;
bool bEmpty = vec1.empty();
vec3.reserve(10);
vec3.assign(3, 4);
VectorTest();
system("pause");
}
头文件include"MyVector.h"
#pragma once
template<typename T>
class CMyVector
{
T* pBuff;
size_t nSize;
size_t nCapacity;
public:
typedef T* iterator;
typedef const T* const_iterator;
public:
iterator begin()
{
return pBuff;
}
iterator end()
{
return pBuff + nSize;
}
const_iterator cbegin()
{
return pBuff;
}
const_iterator cend()
{
return pBuff + nSize;
}
public:
explicit CMyVector(int n = 0);
CMyVector(CMyVector<T> const&);
CMyVector(int n,T const&);
void clear();
~CMyVector();
public:
CMyVector<T>& operator =(CMyVector<T>const &that);
bool operator == (CMyVector<T> const &srcVector)const;
bool operator != (CMyVector<T> const &srcVector)const;
bool operator > (CMyVector<T> const &srcVector)const;
bool operator >= (CMyVector<T> const &srcVector)const;
bool operator < (CMyVector<T> const &srcVector)const;
bool operator <= (CMyVector<T> const &srcVector)const;
public:
void assign(int n, T const&);
void swap(CMyVector<T>&);
friend void swap(CMyVector<T>& v1, CMyVector<T>& v2)
{
v1.swap(v2);
}
public:
size_t size()const;
size_t capacity()const;
bool empty()const;
void reserve(int n);
void resize(int n);
void resize(int n, T const &);
public:
T& at(int index)const;
T& operator[](int index)const;
T& front();
T& back();
public:
void push_back(T const&);
void pop_back();
};
template<typename T>
CMyVector<T>::CMyVector(int n) :nSize(n), nCapacity(n), pBuff(nullptr)
{
pBuff = new T[nCapacity];
memset(pBuff, 0, sizeof(T)*nSize);
}
template<typename T>
CMyVector<T>::CMyVector(CMyVector<T> const&that) :nSize(that), nCapacity(that), pBuff(nullptr)
{
if (nCapacity)
{
pBuff = new T[nCapacity];
memcpy(pBuff, that.pBuff, sizeof(T)*that.nSize);
}
}
template<typename T>
CMyVector<T>::CMyVector(int n, T const&elem) :nSize(n), nCapacity(n), pBuff(nullptr)
{
pBuff = new T[nCapacity];
for (int i = 0; i < nSize; ++i)
{
pBuff[i] = elem;
}
}
template<typename T>
void CMyVector<T>::clear()
{
nSize = 0;
if (pBuff)
{
delete pBuff;
}
pBuff = nullptr;
}
template<typename T>
CMyVector<T>::~CMyVector()
{
clear();
}
template<typename T>
CMyVector<T>& CMyVector<T>::operator=(CMyVector<T>const &that)
{
if*(this != that)
{
T* p_tmp = new T[that.nCapacity];
memcpy(p_tmp, that.pBuff, sizeof(T)*that.nSize);
clear();
this->pBuff = p_tmp;
this->nSize = that.nSize;
this->nCapacity = that.nCapacity;
}
return *this;
}
template<typename T>
bool CMyVector<T>::operator == (CMyVector<T> const &srcVector)const
{
if (nSize != srcVector.nSize)
{
return false;
}
for (int i = 0; i < nSize; ++i)
{
if (pBuff[i] != srcVector.pBuff[i])
return false;
}
return true;
}
template<typename T>
bool CMyVector<T>::operator != (CMyVector<T> const &srcVector)const
{
return !(this == srcVector);
}
template<typename T>
bool CMyVector<T>::operator > (CMyVector<T> const &srcVector)const
{
for (int i = 0; i < nSize; ++i)
{
if (pBuff[i] > srcVector.pBuff[i] || pBuff[i] == srcVector.pBuff[i])
return true;
}
return false;
}
template<typename T>
bool CMyVector<T>::operator < (CMyVector<T> const &srcVector)const
{
for (int i = 0; i < nSize; ++i)
{
if (pBuff[i] < srcVector.pBuff[i] || pBuff[i] == srcVector.pBuff[i])
return true;
}
return false;
}
template<typename T>
bool CMyVector<T>::operator >= (CMyVector<T> const &srcVector)const
{
for (int i = 0; i < nSize; ++i)
{
if (pBuff[i] > srcVector.pBuff[i] || pBuff[i] == srcVector.pBuff[i])
return true;
}
return false;
}
template<typename T>
bool CMyVector<T>::operator <= (CMyVector<T> const &srcVector)const
{
for (int i = 0; i < nSize; ++i)
{
if (pBuff[i] < srcVector.pBuff[i] || pBuff[i] == srcVector.pBuff[i])
return true;
}
return false;
}
template<typename T>
void CMyVector<T>::assign(int n, T const&elem)
{
clear();
if (n > nCapacity&&n < nSize)
{
nSize = nCapacity = n;
}
pBuff = new T[nCapacity];
for (int i = 0; i < n; ++i)
{
pBuff[i] = elem;
}
}
template<typename T>
void CMyVector<T>::swap(CMyVector<T>& srcVector)
{
CMyVector temp;
temp = *this;
*this = srcVector;
srcVector = temp;
}
template<typename T>
size_t CMyVector<T>::size()const
{
return nSize;
}
template<typename T>
size_t CMyVector<T>::capacity()const
{
return nCapacity;
}
template<typename T>
bool CMyVector<T>::empty()const
{
return nSize == 0;
}
template<typename T>
void CMyVector<T>::reserve(int n)
{
if (n > nSize)
{
T* tempBuff = new T[n];
memcpy(tempBuff, pBuff, sizeof(T)*nSize);
if (pBuff)
{
delete pBuff;
}
pBuff = tempBuff;
nCapacity = n;
}
}
template<typename T>
void CMyVector<T>::resize(int n)
{
if (n > nSize)
{
reserve(n);
memset(&pBuff[nSize], 0, sizeof(T)*(n - nSize));
}
if (n < nSize)
{
nSize = n;
}
}
template<typename T>
void CMyVector<T>::resize(int n, T const&elem)
{
resize(n);
for (size_t i = nSize; i < n; ++i)
{
pBuff[i] = elem;
}
}
template<typename T>
T& CMyVector<T>::at(int index)const
{
if (index >= 0 && index < nSize)
{
return pBuff[index];
}
throw std::out_of_range("越界");
}
template<typename T>
T& CMyVector<T>::operator[](int index)const
{
return pBuff[index];
}
template<typename T>
T& CMyVector<T>::front()
{
return pBuff[0];
}
template<typename T>
T& CMyVector<T>::back()
{
return pBuff[nSize-1];
}
template<typename T>
void CMyVector<T>::push_back(T const&elem)
{
if (nSize == nCapacity)
{
return (2 * nCapacity + 1);
}
pBuff[nSize++] = elem;
}
template<typename T>
void CMyVector<T>::pop_back()
{
if (nSize > 0)
{
nSize--;
}
}