#if 1
#pragma once
#include<iostream>
using namespace std;
#include<assert.h>
namespace weige
{
template <class T>
class vector
{
public:
typedef T* iterator; // T类型的迭代器
typedef const T* const_iterator; // const T类型的迭代器
vector()
: start(nullptr)
, finish(nullptr)
, endofstorage(nullptr)
{}
vector(int n, const T& val = T())
{
// 法一:
start = new T[n];
for (int i = 0; i < n; ++i)
start[i] = val;
finish = start + n;
endofstorage = finish;
// 法二:
/*reserve(n);
for (int i = 0; i < n; i++)
push_back(val);*/
}
template <class InputIterator>
vector(InputIterator first, InputIterator last)
: start(nullptr)
, finish(nullptr)
, endofstorage(nullptr)
{
法二:
//while (first != last)
//{
// push_back(*first);
// first++;
//}
// 先计数求出这段区间多少个元素
auto it = first;
int count = 0;
while (it != last)
{
count++;
it++;
}
// 开辟count个<T>类型空间元素的start,并用参数区间给start赋值
start = new T[count];
finish = start;
while (first != last)
{
(*finish) = (*first);
++finish;
++first;
}
endofstorage = finish;
}
vector(const vector<T>& v)
: start(nullptr)
, finish(nullptr)
, endofstorage(nullptr)
{
// 法二:
//vector<T> temp(v.begin(), v.end());// 创建新空间,用形参v来拷贝构造
//swap(temp); // 将*this与temp中三个指针进行交换
// 法一:
size_t n = v.size();
start = new T[n];
for (size_t i = 0; i < n; ++i)
start[i] = v[i];
finish = start + n;
endofstorage = finish;
}
vector<T>& operator=(const vector<T> v) // 值传递
{
// swap(v);
this->swap(v);
return *this;
}
void swap(vector<T> v)
{
std::swap(start, v.start);
std::swap(finish, v.finish);
std::swap(endofstorage, v.endofstorage);
}
~vector()
{
if (start)
{
delete[] start;
start = finish = endofstorage = nullptr;
}
}
//
/// 简单函数实现
iterator begin()
{
return start;
}
iterator end()
{
return finish;
}
const_iterator begin()const
{
return start;
}
const_iterator end()const
{
return finish;
}
size_t size()const
{
return finish - start;
}
size_t capacity()const
{
return endofstorage - start;
}
T& operator [](size_t pos)
{
assert(pos < size());
return start[pos];
}
const T& operator [](size_t pos)const
{
assert(pos < size());
return start[pos];
}
T at(size_t pos)
{
if (pos >= size())
throw OVERFLOW;
return start[pos];
}
T back()
{
return *(finish - 1);
}
const T back()const
{
return *(finish - 1);
}
const T at(size_t pos)const
{
if (pos >= size())
throw OVERFLOW;
return start[pos];
}
void clear()
{
finish = start;
}
bool empty() const
{
return 0 == size();
}
//
/// 容量修改函数
//void resize(size_t newsize, T& val = T())
//{
// size_t oldsize = size();
// // 当新元素个数小于旧元素个数
// if (newsize <= oldsize)
// {
// finish = start + newsize;
// }
// else
// {
// size_t cap = capacity();
// if (newsize > cap) // 当新元素个数大于容量
// reverse(newsize); // 进行扩容
// for (size_t i = oldsize; i < newsize; ++i)
// start[i] = val;
// finish = start + newsize;
// }
//}
void resize(size_t newsize, T val = T())
{
size_t oldsize = size();
if (newsize > oldsize)
{
// 当新元素个数大于容量 进行扩容
size_t cap = capacity();
if (newsize > cap)
reserve(newsize);
for (size_t i = oldsize; i < newsize; ++i)
start[i] = val;
}
finish = start + newsize;
}
void reserve(size_t newcapacity)
{
size_t oldcap = capacity();
if (newcapacity > oldcap)
{
// 开辟新空间
T* temp = new T[newcapacity];
if (start)
{
// 拷贝元素
memcpy(temp, start, sizeof(T) * size());
// 释放旧空间
free(start);
}
// 提前保存元素个数 方便更新finish
size_t sz = size();
start = temp;
finish = start + sz;
endofstorage = start + newcapacity;
}
}
//
/// 内容修改函数
void push_back(const T& val)
{
if (finish == endofstorage)
{
size_t newcap = capacity() == 0 ? 4 : capacity() * 1.5;
reserve(newcap);
}
*finish = val;
finish++;
}
void pop_back()
{
if (finish > start)
--finish;
}
iterator insert(iterator pos, const T& val)
{
assert(pos >= start && pos <= finish);
size_t prepos = pos - start;
if (finish == endofstorage)
{
size_t newcap = (size_t)capacity() == 0 ? 4 : capacity() * 1.5;
reserve(newcap);
pos = start + prepos;
}
auto it = finish-1;
while (it >= pos)
{
*(it + 1) = *it;
--it;
}
*pos = val;
++finish;
return pos;//返回插入元素的位置
}
void insert(iterator pos, int n, const T& val)
{
assert(pos >= start && pos <= finish);
int cap = (int)capacity();
int newsize = (int)size() + n;
if (cap < newsize)
{
reverse(newsize);
}
for (int i = 0; i < n; ++i)
{
*finish = val;
++finish;
}
}
template <class InputIterator>
void insert(iterator pos, InputIterator first, InputIterator last)
{
assert(pos >= start && pos <= finish);
size_t newsize = size() + last - first;
if (newsize > capacity())
reverse(newsize);
auto it = first;
while (it != last)
{
*finish = *it;
++finish;
++it;
}
}
iterator erase(iterator pos)
{
assert(pos >= start && pos <= finish);
auto it = pos;
size_t sz = pos - start;
while (it != finish-1)
{
*it = *(it + 1);
++it;
}
--finish;
return start+sz;
}
iterator erase(iterator first, iterator last)
{
assert(first >= start && last <= finish);
size_t delsize = last - first;
auto it = last;
auto pre = first;
size_t n = last - first;
while (it != finish)
{
*pre = *it;
it++;
pre++;
}
finish -= n;
return first;
}
private:
iterator start; // T类型的指针,指向空间的起始位置
iterator finish; // T类型的指针,指向空间中最后一个元素的下一个位置
iterator endofstorage; // 指向空间末尾位置,内存结束的位置
};
}
void vectortest01()
{
weige::vector<int> v1(10, 1);
weige::vector<int> v2;
for (auto e : v1)
std::cout << e << " ";
std::cout << std::endl;
}
void vectortest02()
{
weige::vector<int> v1(10, 1);
weige::vector<int> v2 = v1;
}
template <class T>
void Print(weige::vector<T> v)
{
for (size_t i = 0; i < v.size(); ++i)
cout << v[i] << " ";
cout << endl;
}
void Test01()
{
weige::vector<int> v1;
weige::vector<int> v2(10, 5);
//weige::vector<int> v3{ 1,2,3,4,5 };
std::string s("hello wordl");
weige::vector<char> v4(s.begin(), s.end());
weige::vector<int> v5(v2);
Print(v2);
Print(v4);
for (auto e : v5)
cout << e << " ";
cout << endl;
auto it = v4.begin();
while (it != v4.end())
{
cout << *it << " ";
++it;
}
cout << endl;
}
void vectortest03()
{
weige::vector<int> v;
v.push_back(1);
v.push_back(1);
v.push_back(1);
v.push_back(1);
v.push_back(1);
v.push_back(1);
Print(v);
}
void vectortest04()
{
weige::vector<int> v(10, 1);
Print(v);
v.resize(10, 2);
Print(v);
v.resize(30, 6);
Print(v);
v.resize(60, 8);
Print(v);
v.resize(40, 2);
Print(v);
v.resize(20, 2);
Print(v);
v.resize(10, 2);
Print(v);
v.resize(5, 2);
Print(v);
v.resize(4, 2);
Print(v);
v.resize(1, 2);
Print(v);
}
void vectortest05()
{
weige::vector<int> v(10, 1);
v.reserve(10);
cout << v.capacity() << endl;
v.reserve(20);
cout << v.capacity() << endl;
v.reserve(30);
cout << v.capacity() << endl;
v.reserve(40);
cout << v.capacity() << endl;
v.reserve(50);
cout << v.capacity() << endl;
v.reserve(40);
cout << v.capacity() << endl;
v.reserve(30);
cout << v.capacity() << endl;
v.reserve(20);
cout << v.capacity() << endl;
v.reserve(10);
cout << v.capacity() << endl;
v.reserve(0);
cout << v.capacity() << endl;
}
void vectortest06()
{
weige::vector<int> v;
int gap = 0;
for (int i = 0; i < 100; i++)
{
v.push_back(i);
gap++;
if (gap == v.capacity())
std::cout << gap << std::endl;
}
}
void vectortest07()
{
weige::vector<weige::vector<int>> vv1;
vv1.resize(5);
for (size_t i = 0; i < vv1.size(); i++)
{
vv1[i].resize(6, 2);
}
for (size_t i = 0; i < vv1.size(); ++i)
{
for (size_t j = 0; j < vv1[i].size(); ++j)
cout << vv1[i][j] << " ";
cout << endl;
}
cout << endl;
weige::vector<weige::vector<int>> vv2;
vv2.resize(5, weige::vector<int>(6, 2));
for (size_t i = 0; i < vv2.size(); ++i)
{
for (size_t j = 0; j < vv2[i].size(); ++j)
cout << vv2[i][j] << " ";
cout << endl;
}
cout << endl;
weige::vector<weige::vector<int>> vv3(5, weige::vector<int>(6, 1));
for (size_t i = 0; i < vv3.size(); ++i)
{
for (size_t j = 0; j < vv3[i].size(); ++j)
cout << vv3[i][j] << " ";
cout << endl;
}
cout << endl;
}
void vectortest08()
{
weige::vector<int> v(10, 1);
v.push_back(100);
Print(v);
v.pop_back();
Print(v);
v.insert(v.begin()+3, 100);
Print(v);
v.insert(v.begin(), 99);
Print(v);
}
void vectortest09()
{
weige::vector<int> v(10, 1);
auto it = v.erase(v.begin());
for (size_t i = 0; i < v.size(); ++i)
cout << *it << " ";
cout << endl;
it = v.erase(v.begin()+2);
for (size_t i = 0; i < v.size(); ++i)
cout << *it << " ";
cout << endl;
Print(v);
}
void vectortest10()
{
int array[] = { 0,1,2,3,4,5,6,7,8,9 };
weige::vector<int> v(array, array+sizeof(array)/sizeof(array[0]));
Print(v);
auto it = v.erase(v.begin());
for (size_t i = 0; i < v.size(); ++i)
cout << *it << " ";
cout << endl;
it = v.erase(v.begin() + 2);
for (size_t i = 0; i < v.size(); ++i)
cout << *it << " ";
cout << endl;
Print(v);
}
void vectortest11()
{
int array[] = { 0,1,2,3,4,5,6,7,8,9 };
weige::vector<int> v(array, array + sizeof(array) / sizeof(array[0]));
Print(v);
auto it = v.erase(v.begin()+2, v.begin()+5);
cout << *it << endl;
Print(v);
}
int main()
{
// vectortest01();
// vectortest02();
// Test01();
// vectortest03();
// vectortest04();
// vectortest05();
// vectortest06();
// vectortest07();
// vectortest08();
// vectortest09();
// vectortest10();
vectortest11();
return 0;
}
#endif
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交