vector의 data() 함수

김민수·2025년 1월 8일

C++

목록 보기
31/68

벡터의 데이터를 배열처럼 사용할 수 있게 해주는 유용한 함수이다. 벡터 내부의 연속된 메모리 블록의 시작 주소를 반환한다.

int main() {
    vector<int> vec = {10, 20, 30, 40};

    int* ptr = vec.data(); // 첫 번째 요소의 주소 반환
    const int* ptr = vec.data(); // 읽기 전용

    for (size_t i = 0; i < vec.size(); ++i) {
        cout << ptr[i] << " "; // 배열처럼 접근
    }

    return 0;
}

1. data() 함수와 &vec[0] 비교

공통점

  • data()&vec[0] 모두 벡터의 첫 번째 요소를 가리키는 포인터를 반환함

차이점

특징data()&vec[0]
안전성벡터가 비어 있어도 유효한 포인터 반환벡터가 비어 있으면 UB 발생
의도 전달벡터 데이터를 배열처럼 사용하려는 의도주소를 직접 계산하려는 의도
C++11 이후 권장 여부권장비권장

2. 주의사항

⦁ 벡터 크기가 변경되면 포인터 무효화

data()가 반환한 포인터는 벡터의 크기나 용량이 변경되면 무효화된다. 이를 사용할 때는 벡터의 상태가 바뀌지 않도록 주의해야 한다.

int main() {
    vector<int> vec = {1, 2, 3};
    int* ptr = vec.data();

    vec.push_back(4); // 크기 변경으로 ptr 무효화
    cout << *ptr;     // 정의되지 않은 동작(UB)

    return 0;
}

⦁ 비어 있는 벡터에서 역참조 금지

data()는 벡터가 비어 있어도 유효한 포인터를 반환하지만, 이를 역참조하면 UB(정의되지 않은 동작)가 발생한다.

int main() {
    vector<int> vec; // 비어 있는 벡터

    int* ptr = vec.data();
    // cout << *ptr; // 역참조 금지

    return 0;
}
profile
안녕하세요

0개의 댓글