본문 바로가기
lang/C,C++

vector - 효율성과 편의성이 높은 array

by Wordbe 2019. 6. 24.
728x90

벡터의 구현

 

vector array인데, size, clear, push_back 등을 지원해주는 효율적이며 편의성이 높은 container이다.

 

1.vector array 기본성질을 유지한다. (maintain the primitive array)

    a pointer variable to the block of allocated memory,

    capacity,

   현재 저장된 item

2. deep-copy 제공, operator= 제공

    destructor 제공

3. resize 제공,

    capacity 바꿔주는 routine 가진다. (reserve routine~)

4. operator[]

5. size, empty, clear

    back, pop_back, push_back

6. nested type 지원한다. iterator, const_iterator, begin, end

 

 

/*
< STL - vector >
studied on Jun 23rd, 2019

 */

#include <algorithm>

template <typename Object>
class Vector
{
private:
    int theSize;
    int theCapacity;
    Object * objects;
public:
    explicit Vector(int initSize = 0) : theSize { initSize },
        theCapacity{ initSize + SPARE_CAPACITY }
        { objects = new Object[theCapacity]}
    
    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); // It is a optimal way to multiply by 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++] = 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;
}
728x90

'lang > C,C++' 카테고리의 다른 글

[STL] erase  (0) 2019.09.19
C++ String (#include <string>)  (0) 2019.09.03
[STL] priority_queue  (0) 2019.07.21
연산자 오버로딩  (0) 2019.07.14
Class  (0) 2019.06.08

댓글