iterator 질문
279
작성한 질문수 30
-

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





