오븐 노트

[C++] vector #4 본문

Develop/C++

[C++] vector #4

오 븐 2023. 5. 31. 05:47

vector와 iterator의 일부 기능 구현

#include <iostream>
using namespace std;
#include <vector>

template<typename T>
class Iterator
{
public:
    Iterator() : _ptr(nullptr)
    {

    }

    Iterator(T* ptr) : _ptr(ptr)
    {

    }

    Iterator& operator++() // 자기 자신의 참조를 뱉어주는 전위형
    {
        _ptr++;
        return *this;

        //int a = 1;
        //int b = ++(++a); // 자기 자신의 참조를 뱉어주는 형태
    }

    Iterator operator++(int) // 복사된 값을 뱉어주는 후위형
    {
        Iterator temp = *this;
        _ptr++;
        return temp;

        //int a = 1;
        //int b = (a++); // 복사된 값을 뱉어주는 형태
    }

    Iterator& operator--() // 자기 자신의 참조를 뱉어주는 전위형
    {
        _ptr--;
        return *this;
    }

    Iterator operator--(int) // 복사된 값을 뱉어주는 후위형
    {
        Iterator temp = *this;
        _ptr--;
        return temp;
    }

    Iterator operator+(const int count)
    {
        Iterator temp = *this;
        temp._ptr += count;
        return temp;
    }

    Iterator operator-(const int count)
    {
        Iterator temp = *this;
        temp._ptr -= count;
        return temp;
    }

    bool operator==(const Iterator& right)
    {
        return _ptr == right._ptr;
    }

    bool operator!=(const Iterator& right)
    {
        return !(*this == right); // 상단의 == 오퍼레이터를 호출하여 판단시킬 수 있음
    }

    T& operator*() // 역참조 문법 지원 기능
    {
        return *_ptr; // 해당 값의 참조값을 따와서 T&(레퍼런스) 형태로 반환
    }

public:
    T* _ptr; // Iterator는 포인터를 래핑하는 클래스

};

template<typename T>
class Vector
{
public:

    Vector() : _data(nullptr), _size(0), _capacity(0)
    {

    }

    ~Vector()
    {
        if (_data)
            delete[] _data;
    }

    void push_back(const T& val)
    {
        if (_size == _capacity)
        {
            // 증설 작업
            int newCapacity = static_cast<int>(_capacity * 1.5);
            if (newCapacity == _capacity)
                newCapacity++;

            reserve(newCapacity);
        }

        // 데이터 저장
        _data[_size] = val;

        // 데이터 개수 증가
        _size++;
    }

    void reserve(int capacity)
    {
        _capacity = capacity;

        T* newData = new T[_capacity];

        // 데이터 복사
        for (int i = 0; i < _size; i++)
            newData[i] = _data[i];

        // 기존에 있던 데이터를 날림
        if (_data)
            delete[] _data;

        _data = newData;
    }

    T& operator[](const int pos) { return _data[pos]; }

    int size() { return _size; }
    int capacity() { return _capacity; }

public:
    typedef Iterator<T> iterator;

    void clear() { _size = 0; }
    iterator begin() { return iterator(&_data[0]); }
    iterator end() { return begin() + _size; }

private:
    T* _data;
    int _size;
    int _capacity;
};

int main()
{
    Vector<int> v;

    v.reserve(100);

    for (int i = 0; i < 100; i++)
    {
        v.push_back(i);
        cout << v.size() << " " << v.capacity() << endl;
    }

    for (int i = 0; i < v.size(); i++)
    {
        cout << v[i] << endl;
    }

    cout << "---------------" << endl;

    for (Vector<int>::iterator it = v.begin(); it != v.end(); ++it)
    {
        cout << (*it) << endl;
    }

    v.clear();

    return 0;
}

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의
 
C++ 카테고리의 글은 인프런 Rookiss님의 강의를 공부하며 정리하는 내용입니다.
이미 알고 있는 내용도 다시 정리 되어있을 수 있습니다.

 

모든 글은 제가 공부하기 위해 작성합니다.

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

[C++] list #2  (0) 2023.06.09
[C++] list #1  (0) 2023.06.08
[C++] vector #3  (0) 2023.05.29
[C++] vector #2  (0) 2023.05.29
[C++] vector #1  (0) 2023.05.18