벡터의 데이터를 배열처럼 사용할 수 있게 해주는 유용한 함수이다. 벡터 내부의 연속된 메모리 블록의 시작 주소를 반환한다.
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;
}
공통점
data()와 &vec[0] 모두 벡터의 첫 번째 요소를 가리키는 포인터를 반환함차이점
| 특징 | data() | &vec[0] |
|---|---|---|
| 안전성 | 벡터가 비어 있어도 유효한 포인터 반환 | 벡터가 비어 있으면 UB 발생 |
| 의도 전달 | 벡터 데이터를 배열처럼 사용하려는 의도 | 주소를 직접 계산하려는 의도 |
| C++11 이후 권장 여부 | 권장 | 비권장 |
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;
}