티스토리 뷰
T& at(int index) {
if(index < n) {
return data[n];
}
throw "out of range";
}
와
T* begin() { return data; }
const T* begin() const { return data;}
T* end() { return data + n; };
const T* end() const { return data + n; }
의 차이점은 뭘까?
둘 다 동일하게 T* data의 인자를 반환하도록 생성할 이유라면,
T& begin() { return data[0]; }
와 같이 쓰면 안되나?
찾아보니, 이는 사용 목적의 차이라고 한다.
T& at(int index)`에서 참조 사용
1. 안전성과 직접 접근:
`at` 함수는 컨테이너의 특정 요소에 대한 직접적이고 안전한 접근을 제공한다. 참조를 반환함으로써, 함수는 컨테이너 내의 실제 요소를 "별명"으로 직접 다룰 수 있게 해준다. 이렇게 하면, 반환된 값이 컨테이너의 실제 요소를 나타내는 것이 명확해지며, 사용자는 이를 통해 해당 요소를 직접 읽거나 수정할 수 있게 된다.
2. 예외 처리:
`at` 함수는 범위 검사를 수행하고, 주어진 인덱스가 유효하지 않은 경우 예외를 던진다. 참조를 사용하면, 이러한 유효성 검사를 수행한 후에만 요소에 접근할 수 있으므로, 안전성이 보장된다.
T* begin() 및 T* end() 에서 포인터 사용
1. 반복자(iterator) 구현:
이러한 함수들은 컨테이너의 반복자를 제공한다.
C++에서 반복자는 종종 포인터와 유사한 방식으로 작동하는데, begin() 은 컨테이너의 첫 번째 요소를 가리키는 포인터를, end()는 컨테이너의 마지막 요소 다음을 가리키는 포인터를 반환하도록 한다.
2. 범위 기반 루프와의 호환성:
begin()과 end()가 포인터를 반환하면, 이들은 범위 기반 for 루프(for(auto& item : container))와 같은 C++ 언어 구조와 잘 호환된다. 이러한 루프는 컨테이너의 시작과 끝을 나타내는 반복자(이 경우 포인터)를 사용하여 컨테이너를 반복 처리한다.
3. 포인터 산술: end() 함수에서 `data + n`을 사용하는 것은 포인터 산술의 한 예이며, 이는 포인터가 가리키는 주소에서 `n` 요소만큼 떨어진 위치를 가리키는 새로운 포인터를 생성한다. 이러한 연산은 참조로는 수행할 수 없기 때문에 포인터 변수를 반환하게 해야 한다.
요약
- T& at(int index):
안전하고 직접적인 요소 접근을 위해 참조를 사용합니다. 예외 처리를 통해 범위 검사를 수행합니다.
- T* begin() 및 T* end():
반복자로서의 역할을 수행하기 위해 포인터를 사용합니다. 범위 기반 루프와 호환되며, 포인터 산술을 활용합니다.
이러한 방식으로 참조와 포인터를 사용함으로써, C++는 더 풍부하고 유연한 프로그래밍 패러다임을 제공하게 됩니다.
'C++ > 참고' 카테고리의 다른 글
[C++] 문법: 범용 참조 (Args&&... args) (0) | 2023.12.17 |
---|---|
[C++] 문법: 가변 템플릿 인자 (...args) (0) | 2023.12.17 |
[C++] 문법: Class member 함수를 const와 非const를 따로 선언하는 이유 (0) | 2023.12.16 |
[C++] 문법: 포인터 변수와 참조 (0) | 2023.12.16 |
[C++] 문법: 참조와 역참조 (0) | 2023.12.16 |
- 정보보안기사 #실기 #정리
- 인천 구월동 이탈리안 맛집
- Async
- redux
- 인천 구월동 맛집
- AsyncStorage
- redux-thunk
- 파니노구스토
- javascript
- react-native
- await
- 맛집
- react
- Promise
- 이탈리안 레스토랑
- Total
- Today
- Yesterday