数据结构-Vector

自定义Vector实现:

///////////////////////////////////////////////////////////////////////////////
//
//  FileName    :   c2_vector.h
//  Author      :   Jimmy Han
//  Date        :   N.A                 v1    
//              :   2014/07/13 09:30    v2    
//
///////////////////////////////////////////////////////////////////////////////
#include <cassert>
 
template <class object>
class Vector {
public:
    explicit Vector(int initsize = 0)
        : _size(initsize), _capacity(initsize + SPARE_CAPACITY)
            {_object = new object[_capacity];}

    Vector(const Vector &rhs) : _object(NULL) 
        { operator=(rhs);}
        
    ~Vector()
        {delete [] _object;}
        
    const Vector& operator=(const Vector &rhs)
    {
        if(this != &rhs)
            {
                delete [] _object;
                _size = rhs._size;
                _capacity = rhs._capacity;
                
                _object = new object[_capacity];
                for(int k = 0; k < _size; k++)
                    _object[k] = rhs._object[k];    
            }
            return *this;
    }
    
    void resize(int newSize)
    {
        if(newSize > _capacity)
            reserve(newSize * 2 + 1);
        _size = newSize;
    }
    
    void reserve(int newCapacity)
    {
        if(newCapacity < _size)
            return;
        
        object *oldobject = _object;
        _object = new object[newCapacity];
        for (int n=0; n<_size; n++)
            _object[n] = oldobject[n];
        delete [] oldobject;
        _capacity = newCapacity;
    }
    
    object& operator[](const int index)
    {
        assert(index >= 0 && index < _size);
        return _object[index];
    }
    
    const object& operator[](const int index) const
    {
        assert(index >= 0 && index < _size);
        return _object[index];
    }
    
    bool empty() const 
    {return _size == 0;}
    
    int size() const 
    {return _size;}
    
    int capacity() const 
    {return _capacity;}
    
    void push_back(const object &x)
    {
        if(_size == _capacity)
            reserve(2*_capacity + 1);
        _object[_size++] = x;
    }
    
    void pop_back()
        {_size--;}
    
    const object& back() const 
        { return _object[_size - 1];}
    
    typedef object* iterator ;
    typedef const object* const_iterator;
    
    iterator begin()
    {return &_object[0];}
    
    iterator end()
    {return     &_object[_size];}

    const_iterator begin() const
    {return &_object[0];}
    
    const_iterator end() const
    {return &_object[_size];}    

    enum{ SPARE_CAPACITY = 3};    
private:
    int _size;
    int _capacity;
    object *_object;    
};

 

 

 

自定义Vector测试程序:

///////////////////////////////////////////////////////////////////////////////
//
//  FileName    :   c2_vector.cpp
//  Author      :   Jimmy Han
//  Date        :   N.A 			    v1    
//              :   2014/07/13 09:30    v2    
// $ ./a.exe
// Calculate the size of self made Vector class
// sizeof(vint) is: 12

// Self made Vector size test:
// size of vint is: 5
// capacity of vint is: 7
// size of vint2 is: 8
// capacity of vint2 is: 17
// the last element of vint is: 4
// the 5 element of vint is: 4

// Self made iterator test:
// 0 1 2 3

// Iterator called by others:
// [0 1 2 3]
// [0 1 2 3 4 1919249516 1547322171 1735357008]
//
///////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include "printCollection.h"
#include "c2_vector.h"
using namespace std;
int main()
{
	//default constructor
	Vector<int> vint;
	Vector<int> vint2;
	
	//calc class size, two int, one pointer, so size is 12
	cout << "Calculate the size of self made Vector class " << endl;
	cout <<"sizeof(vint) is: " << sizeof(vint) << endl << endl;
	
	//void push_back(const object &x)
	for (int n=0; n<5; n++)
		vint.push_back(n);
	
	//const Vector& operator=(const Vector &rhs)
	vint2 = vint;
	
	//void resize( int newSize)
	vint2.resize(8);
	
	//int size(); int capacity();
	cout << "Self made Vector size test: " << endl;
	cout << "size of vint is: " << vint.size() << endl;
	cout << "capacity of vint is: " << vint.capacity() << endl;
	cout << "size of vint2 is: " << vint2.size() << endl;
	cout << "capacity of vint2 is: " << vint2.capacity() << endl;
	
	//const object& back();
	cout << "the last element of vint is: " << vint.back() << endl;
	
	//object& operator[](const int index)
	cout << "the 5 element of vint is: " << vint[4] << endl << endl;
	
	//void pop_back()
	vint.pop_back();
	
	//typedef object* iterator; typedef const ojbect* const_iterator
	//iterator begin(); iterator end();
	cout << "Self made iterator test: " << endl;
	for (Vector<int>::iterator iter = vint.begin(); iter != vint.end(); iter++)
	{
		cout << *iter << " ";
	}
	cout << endl << endl;
	
	cout << "Iterator called by others: " << endl;
	printCollection(vint); 
	//after resize, not initilized member got random number
	printCollection(vint2); 
}

 

posted on 2014-07-05 16:22  醉清风JM  阅读(281)  评论(0编辑  收藏  举报

导航