본문 바로가기
C,C++/C++

[C++] std::vector 컨테이너의 반복자를 통해 포인터(주소) 얻기

by woohyeon 2020. 8. 29.
반응형

vector 컨테이너의 반복자를 통해 해당 반복자가 가리키는 요소의 주소를 얻을 수 있다.

우선 벡터는 연속적인 배열이기 때문에 다음과 같이 첫 번째 원소의 주소를 통해 배열의 시작 주소를 구할 수 있다. 그리고 포인터의 특성을 이용해 모든 요소에 접근할 수 있다.

void main()
{
    vector<int> v1 {1, 2, 3, 4, 5};
    int* beginAddrOfV1 = &v1[0];
    
    for(size_t i = 0; i < v1.size(); ++i)
    {
        cout << *(beginAddrOfV1 + i) << " ";
    }
    
    cout << endl;
}

 

 

 

위와 비슷한 방식으로 반복자를 통해 요소에 접근하여 주소를 구하면 해당 요소를 가리키는 포인터를 얻을 수 있다.

void main()
{
    vector<int> v1{ 1, 2, 3, 4, 5 };
    auto beg = v1.begin();

    for (size_t i = 0; i < v1.size(); ++i)
    {
        cout << "[" << i << "]: " << &(*(beg + i)) << ", " << *(beg + i) << endl;
    }

    cout << endl;
}

 

기존의 주소와 비교해보면 주소값이 동일한 것을 확인할 수 있다.

void main()
{
    vector<int> v1{ 1, 2, 3, 4, 5 };
    int* beginAddrOfV1 = &v1[0];
    auto beg = v1.begin();

    for (size_t i = 0; i < v1.size(); ++i)
    {
        cout << "[" << i << "]: " << beginAddrOfV1 + i << ", " << &(*(beg + i)) 
             << ", " << *(beg + i) << endl;
    }

    cout << endl;
}

 

 

 

이러한 것을 이용해 memcpy에 vector 클래스를 적용할 수도 있다.

void main()
{
    vector<pair<float, float>> src;
    src.emplace_back(make_pair(1.f, 2.f));
    src.emplace_back(make_pair(3.f, 4.f));
    src.emplace_back(make_pair(5.f, 6.f));
    
    vector<pair<float, float>> dest;
    dest.resize(src.size());
    
    
    // 반복자 이용
    // memcpy(&*dest.begin(), &*src.begin(), sizeof(pair<float, float>) * src.size()); 
    memcpy(&dest[0], &src[0], sizeof(pair<float, float>) * src.size());     
    
    for(const auto& mypair : dest)
    {
        cout << mypair.first << ", " << mypair.second << endl;
    }

    cout << endl;
}

 




댓글