※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로
C++에 대한 구체적인 정보를 담고 있지 않습니다.
# vector iterator
# 내용과 좀 무관하긴 하지만 오류가 거슬려서 없애는방법을 찾아봄..
vector<int> v(10);
for (vector<int>::size_type i = 0; i < v.size(); i++)
{
v[i] = i;
}
for (int i = 0; i < static_cast<unsigned int>(v.size()); i++)
{
v[i] = i;
}
ㆍ v.size가 unsigned int를 뱉어가지고 경고가뜨길레... 이렇게하면 없어진다!
int main()
{
vector<int> v(10);
for (vector<int>::size_type i = 0; i < v.size(); i++)
{
v[i] = i;
}
vector<int>::iterator it;
int* ptr;
it = v.begin();
ptr = &v[0];
cout << (*it) << endl;
cout << (*ptr) << endl;
}
ㆍ 이터레이터와 포인터를 비교해 보기 위해 위 코드를 작성해보고 아래와 같이 디버그를 돌려봤다.
ㆍ 선언한 포인터 ptr은 뭐 당연하게도 주소가 잘 들어가있고 이터레이터도 내부적으로 ptr을 들고 있는 모습이다
# 그렇다면 이터레이터는 포인터와 차별점이 무엇일까??
ㆍ 다양한 정보를 들고있는데 뭐 proxy가 있는걸로 보아 내가 어떤 컨테이너에 속해있는지, nextiter 다음 반복자 등등 여러 정보를 들고있는거로 추론된다.
# 얘는 포인터도 아닌데 *을찍고 포인터 처럼 되는 이유는?
ㆍ 이터레이터를 타고 들어가보면 연산자 오버로딩, 포인터처럼 활용할 수 있게끔 정의되어있구나 라는걸 어느정도 추론할 수 있다.
it++;
++it;
ptr++;
++ptr;
ㆍ 정의되어있으니 당연한 말이지만 된다.
ㆍ 이터레이터의 end()같은 경우엔 유효한 데이터 다음을 가리키므로 끝을 판별할때만 사용하자
# begin() , end() 활용
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << (*it) << endl;
}
ㆍ 유효하지 않은 데이터를 만날때 까지 돌겠다는 뜻.
※ ++it 과 it++?
ㆍ 아주 미세하게 ++it이 효율이 더 좋아서 사용하는것... 정말로?
ㆍ 연산자 오버로딩에서 전위, 후위 차이 공부했던게 여기서 나온다. 위에가 전위 뒤에가 후위인데 복사하는 과정이 빠지니까 효율이 미세하게 더 좋다는거구나
int* ptrBegin = &v[0]; //v.begin()._Ptr;
int* ptrEnd = ptrBegin + 10; //v.end()._Ptr
for (int* ptr = ptrBegin; ptr != ptrEnd; ++ptr)
{
cout << (*ptr) << endl;
}
ㆍ 이터레이터 내부에 _Ptr이라는게 있다는걸 디버깅으로 확인 해 봤다. 당연히 포인터 처럼 그대로 사용 가능한 모습
※ 더 복잡해보이는데 왜..?
for (vector<int>::size_type i = 0; i < v.size(); i++)
{
v[i] = i;
}
ㆍ 벡터 한정에선 위에 버전이 더 자주쓰인다
ㆍ 하지만 이터레이터는 다른 컨테이너에서도 공통적으로 있는 개념이다.
# 추가로 지원하는 기능들
//const int*;
vector<int>::const_iterator cit1 = v.cbegin();
//*cit1 =100; 오류
vector<int>::reverse_iterator it = v.rbegin();
ㆍ const 이터레이터와 리버스 이터레이터
# 컨테이너와 잘 호환되는 포인터 느낌으로 이해
'C++프로그래밍 > 자료구조,알고리즘(추후확장)' 카테고리의 다른 글
vector 직접 구현해보기 (1) | 2024.09.28 |
---|---|
vector의 삽입삭제, 인덱스접근 (1) | 2024.09.28 |
vector의 동작 원리(size / capacity) (0) | 2024.09.28 |
콜백함수 (0) | 2024.09.27 |
클래스 템플릿 (0) | 2024.09.27 |