작성
·
241
0
안녕하세요 강사님 여기 코드에서 iterator begin() 이 부분이 어떻게 시작점 주소를 뱉어 줄 수 있엇나요? 질문하기 전에 종단점을 찍고 f11을 누르면서 찬찬히 살펴 봣는데 iterator부분의 생성자가 호출 되면서 빠져나오는데 이때 생성자에서 포인터 초기값을 해줘서 그런건가요? 만약에 이게 맞다면 iterator 클래스 생성자에서 초기화할 맴버변수가 많을때는 특정 값을 뱉어내기 힘들지 않나요??
답변 1
0
질문이 이해가 잘 안갑니다.
begin()은 iterator(시작주소)를 받아주고 있기 때문에
내부적으로 ptr에 시작주소를 들고 있는 상태입니다.
어떤 부분을 질문하신걸까요?
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()이라는 함수는 어떠한 원리로 주소값을 뱉어줄 수 있는 건가요?
질문이 너무 길어졌네요. 제가 잘 전달 했는지 걱정이 되네요. 바쁜 와중에도 이렇게 답변해 주셔서 감사합니다.