inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

vector #4

iterator 질문

279

rlagusdn0086

작성한 질문수 30

0

C++

답변 1

0

Rookiss

질문이 이해가 잘 안갑니다.

begin()은 iterator(시작주소)를 받아주고 있기 때문에
내부적으로 ptr에 시작주소를 들고 있는 상태입니다.

어떤 부분을 질문하신걸까요?

0

rlagusdn0086

 template<typename T>

class Iterator

{

public:

Iterator() : _ptr(nullptr)

{

 

}

 

Iterator(T* ptr) : _ptr(ptr)

{

 

}

 

Iterator& operator++()

{

_ptr++;

return *this;

}

 

Iterator operator++(int)

{

Iterator temp = *this;

_ptr++;

return temp;

}

 

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 _ptr != right._ptr;

}

 

T& operator*()

{

return *_ptr;

}

public: 

T* _ptr;

};

 

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;

}

 

for (Vector<int>::iterator it = v.begin(); it != v.end(); ++it)

{

cout << (*it) << endl;

}

 

 

return 0;

}

 

이번 강의에서 다룬 코드 인데요 여기서 제가 궁금한 코드 부분이 

iterator begin() { return iterator(&_data[0]); }

iterator end() { return begin() + _size; }

이 부분인데요 이 부분은 

for (Vector<int>::iterator it = v.begin(); it != v.end(); ++it) 이 for 문을 실행하면서 저희가 만든 Vector 클래스 안에 있는 begin의 함수를 호출하였습니다. 그리고 함수의 반환 형식이 iterator라서 포인터 값을 뱉어주는것은 얼추 이해를 했지만 디버그 하던 중 Iterator클래스의 생성자가 실행이 되더라고요

[아래는 iterator begin() { return iterator(&_data[0]); } 을 실행했더니 호출된 Iterator 생성자]

Iterator(T* ptr) : _ptr(ptr)

{

 

}

이때 생성자가 호출이 되면서 v.begin() 이라는 함수가 주소 값을 뱉을 수 있었던 건가요? 제 질문을 요약하자만 저희가 만든 Vector안의 begin()이라는 함수는 어떠한 원리로 주소값을 뱉어줄 수 있는 건가요?  

질문이 너무 길어졌네요. 제가 잘 전달 했는지 걱정이 되네요. 바쁜 와중에도 이렇게 답변해 주셔서 감사합니다.

 

 

visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.

0

561

1

정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?

0

456

1

strcpy() 구현 관련 질문

0

543

1

빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?

0

477

1

클래스 타입의 포인터 질문합니다

0

560

1

입력값을 enum 값에 넣어주는거 이제 막혔나요?

0

505

1

템플릿 특수화 관련 질문

0

393

1

포인터 관련 질문합니다!

0

276

1

Unable to start assembler. Check your settings.

0

851

2

cpu선택

0

552

1

포인터 질문이 있습니다

0

335

1

20:35 에서 구조체 크기에 대한 질문입니다!

0

592

1

iterator 삭제관련

0

419

1

함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!

0

316

1

15 분 45초 대 질문

0

319

0

스택 프레임 질문합니다!

2

316

1

오른값 참조 in 게임

0

394

0

동적할당 질문이 있습니다

0

460

1

안녕하세요 메모리에 대해 질문드립니다.

0

314

1

함수객체 의 매개변수

0

370

1

복사생성자

0

441

1

main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요

0

431

1

포인터 실습 강의를 보고 궁금한게 있습니다.

0

360

1

스택 오버플로우

2

804

1