64,654
社区成员
发帖
与我相关
我的任务
分享
#include <algorithm>
#include <new>
#include <cstddef>
template <typename T>
class Vector
{
public:
typedef T * iterator;
typedef std::size_t size_type;
private:
iterator element;
iterator first_free;
iterator end_of_storge;
void destroy();//销毁元素及释放内存
template <typename iter>
void copy_elem(iter b, iter e);//复制元素到指定位置
void reallocate();//重新分配足够空间,一般是原来空间的两倍
public:
Vector() : element(0), first_free(0), end_of_storge(0) {}
template <typename iter>
Vector(iter b, iter e);//使用同类模版构造
Vector(size_type n, const T &t);
Vector(const Vector &vec);//复制构造
~Vector() { destroy(); }
Vector &operator =(const Vector &vec);//赋值重载
void push_back(const T &t);
size_type size() const { return first_free - element; }
void resize(size_type new_size, const T &t);
void reserved(size_type n);//重新分配空间
size_type capacity() const { return end_of_storge - element; }
T &operator [](size_type i) { return *(element + i); }
const T &operator [](size_type i) const { return *(element + i); }
iterator begin() { return element; }
const iterator begin() const { return element; }
iterator end() { return first_free; }
const iterator end() const { return first_free; }
};
template <typename T>
void Vector<T>::reallocate()
{
size_type old_size = size();
size_type new_size = 2 * (std::max<size_type>(old_size, 1));
iterator newelement = static_cast<T *>(operator new[](new_size * sizeof(T)));
iterator pold = element;
iterator pnew = newelement;
while(pold != first_free)
new (pnew++) T(*pold++);//定位new构造
destroy();
element = newelement;
first_free = element + old_size;
end_of_storge = element + new_size;
}
template <typename T>
void Vector<T>::push_back(const T &t)
{
if(first_free = end_of_storge)
reallocate();
new (first_free) T(t);
++first_free;
}
template <typename T>//没有问题
void Vector<T>::reserved(size_type n)
{
size_type old_size = size();
iterator newelement = static_cast<T *>(operator new[](sizeof(T) * n));
iterator pold = element;
iterator pnew = newelement;
while(pold != first_free)
new (pnew++) T(*pold++);
destroy();
element = newelement;
first_free = element + old_size;
end_of_storge = element + n;
}
#include "stdafx.h"
#include "template.h"
int main()
{
std::ofstream fout("note.txt");
if(!fout.is_open())
{
std::cerr << "oh.\n";
exit(EXIT_FAILURE);
}
Vector<int> ivec;
std::cout << "capacity = " << ivec.capacity() << std::endl;
fout << "capacity = " << ivec.capacity() << std::endl;
ivec.reserved(2);
std::cout << "capacity = " << ivec.capacity() << std::endl;
fout << "capacity = " << ivec.capacity() << std::endl;
int n;
while(std::cin >> n)
ivec.push_back(n);
for(Vector<int>::size_type i = 0; i < ivec.size(); ++i)
{
std::cout << ivec[i] << " ";
fout << ivec[i] << " ";
}
std::cout << std::endl;
return 0;
}
template <typename T>
void Vector<T>::push_back(const T &t)
{
if(first_free = end_of_storge) ///这里有错吧?应该要用==吧?
reallocate();
new (first_free) T(t);
++first_free;
}