앞서 구현한 벡터는 vector_get()을 통해 직접 인덱싱할 수 있었지만, C++의 for (auto x : vec) 같은 문법은 지원하지 않기 때문에 반복문에서 사용하기가 조금 불편합니다.
그래서 이번에는 C 스타일로 이터레이터(iterator)를 만들어서 while, for 루프에서 자연스럽게 벡터를 순회할 수 있도록 기능을 확장해 보겠습니다.
🔧 이터레이터 구조 정의
typedef struct {
StaticVector* vector;
size_t index;
} VectorIterator;
- vector: 순회 대상이 되는 벡터
- index: 현재 이터레이터가 가리키고 있는 인덱스
📜 이터레이터 함수들
// 시작 위치의 이터레이터 반환
VectorIterator vector_begin(StaticVector* vec) {
VectorIterator it = {vec, 0};
return it;
}
// 다음 요소가 존재하는지 확인
int vector_iterator_has_next(VectorIterator* it) {
return it->index < it->vector->size;
}
// 다음 요소를 반환하고, 내부 인덱스를 증가
void* vector_iterator_next(VectorIterator* it) {
if (!vector_iterator_has_next(it)) return NULL;
return it->vector->buffer + (it->element_size * it->index++);
}
🧪 사용 예시
int main() {
int buffer[MAX_VECTOR_CAPACITY];
StaticVector vec;
vector_init_static(&vec, buffer, sizeof(int), MAX_VECTOR_CAPACITY);
for (int i = 1; i <= 5; ++i) {
vector_push_back(&vec, &i); // 1 ~ 5 저장
}
printf("== 벡터 요소 출력 ==\n");
VectorIterator it = vector_begin(&vec);
while (vector_iterator_has_next(&it)) {
int* val = (int*)vector_iterator_next(&it);
printf("%d ", *val);
}
printf("\n");
return 0;
}
출력:
== 벡터 요소 출력 ==
1 2 3 4 5
✅ 이터레이터 도입의 장점
이점 | 설명 |
코드 가독성 향상 | 반복문에서 인덱싱 없이 순회 가능 |
범용성 | 모든 타입의 벡터에 공통으로 사용 가능 |
재사용성 | 이터레이터 구조를 통해 다른 컨테이너에도 확장 가능 |
🔚 마무리하며
이번 글에서는 정적 제네릭 벡터에 이터레이터 기능을 추가해 반복문에서 쉽게 사용할 수 있도록 확장해 보았습니다. 이를 통해 C에서도 마치 고급 언어처럼 벡터를 유연하게 사용할 수 있게 되었죠!
'프로그래밍 > C언어' 카테고리의 다른 글
C 언어에서 제네릭 벡터를 구현해보자 (임베디드 환경 대응) (0) | 2025.04.09 |
---|