C++프로그래밍/자료구조,알고리즘(추후확장)

vector와 iterator

season97 2024. 9. 28. 12:08

※ 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 이터레이터와 리버스 이터레이터

 

 

# 컨테이너와 잘 호환되는 포인터 느낌으로 이해