본문 바로가기
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

댓글