按书中的方式,实现一下简单的Vector ,加深理解。
#pragma once
#include <algorithm>
template <typename Object>
class Vector {
public :
explicit Vector(int initSize = 0) : theSize(initSize),theCapacity(initSize+SPARE_CAPACITY) { }
Vector(const Vector & rhs) : theSize(rhs.theSize), theCapacity(rhs.theCapacity), objects(nullptr)
{
objects = new Object[theCapacity];
for (int k = 0; k < theSize; ++k)
objects[k] = rhs.objects[k];
}
Vector & operator = (const Vector & rhs)
{
Vector copy = rhs;
std::swap(*this, copy);
return *this;
}
~Vector() { delete[] objects; }
Vector(Vector && rhs) : theSize(rhs.theSize), theCapacity(rhs.theCapacity), objects(rhs.objects)
{
rhs.objects = nullptr;
rhs.theSize = 0;
rhs.theCapacity = 0;
}
Vector & operator = (Vector && rhs)
{
std::swap(theSize, rhs.theSize);
std::swap(theCapacity, rhs.theCapacity);
std::swap(objects, rhs.objects);
return *this;
}
void resize(int newSize)
{
if (newSize > theCapacity)
reserve(newSize * 2);
theSize = newSize;
}
void reserve(int newCapacity)
{
if (newCapacity < theSize)
return;
Object *newArray = new Object[newCapacity];
for (int k = 0; k < theSize; ++k)
newArray[k] = std::move(objects[k]);
theCapacity = newCapacity;
std::swap(objects, newArray);
delete[] newArray;
}
Object & operator[] (int index){ return objects[index];}
const Object & operator[] (int index) const { return objects[index]; }
bool empty() const { return size() == 0; }
int size() const { return theSize; }
int capacity() const { return theCapacity; }
void push_back(const Object & x)
{
if (theSize == theCapacity)
reserve(2 * theCapacity + 1);
objects[theSize++] = x;
}
void push_back(Object && x)
{
if (theSize == theCapacity)
reserve(2 * theCapacity + 1);
objects[theSize++] = std::move(x);
}
void pop_back() { --theSize; }
const Object & back() const { return objects[theSize - 1]; }
typedef Object *iterator;
typedef const Object *const_iterator;
iterator begin() { return &objects[0]; }
const_iterator begin() const { return &objects[0]; }
iterator end() { return &objects[size()];}
const_iterator end() const { return &objects[size()]; }
static const int SPARE_CAPACITY = 16;
private:
int theSize;
int theCapacity;
Object * objects;
};
#include <iostream>
#include <string>
#include "Vector.h"
using namespace std;
int main()
{
Vector<string> sentence;
sentence.reserve(5);
sentence.push_back("Hello ");
sentence.push_back("Everyone!");
sentence.push_back("How are you!");
std::cout << " size(): " << sentence.size() << endl;
std::cout << " capacity(): " << sentence.capacity() << endl;
std::cout << " back(): " << sentence.back() << endl;
sentence.pop_back();
std::cout << " size(): " << sentence.size() << endl;
std::cout << " capacity(): " << sentence.capacity() << endl;
sentence.resize(20);
std::cout << " size(): " << sentence.size() << endl;
std::cout << " capacity(): " << sentence.capacity() << endl;
auto iter = sentence.begin();
while (iter != sentence.end())
{
std::cout << *iter++ << endl;
}
return 0;
}