티스토리 뷰

프로젝트 목표

  • C언어를 배우고 나서 C++ 또는 OOP로 발전시키고자 하는 모든 개발자들

  • 기본적인 C 문법은 모두 알고 있는 상태여야하며 그렇지 않을 경우 이해에 어려움이 있을 수 있음.


목표

  • C style로 vector 작성

디자인

  • vector는 다음의 멤버 변수를 갖는다.
      • int* data
        원소가 저장될 공간

      • int capacity
        data의 크기

      • int length
        저장된 원소의 수
  • 다음의 helper 함수가 필요하다.
      • int ensure_capacity(vector* v, int to_add)
        v.data에 to_add만큼의 공간이 남아있는지 확인한다. 남아있다면 1을, 그렇지 않다면 0을 반환한다.

      • void increase_capacity(vector* v)
        v.data를 v.capacity의 두 배로 재할당한다.

      • void initialize(vector* v)
        v의 멤버변수를 초기화한다.

      • void finalize(vector* v)
        v.data를 해제한다.

      • void add(vector* v, int element)
        element를 v의 length번째 원소로 지정한다. length는 1이 커진다.

      • int get(vector* v, int index)
        v.data의 index번째 원소를 반환한다.

      • int set(vector* v, int index, int element)
        v.data의 index번째 원소를 element로 지정한 후 이전 값을 반환한다.

      • int remove(vector* v, int index)
        v.data의 index번째 원소를 삭제한 후 이전 값을 반환한다.

      • void print(vector* v)
        v.data를 {} 배열 포맷에 맞추어 출력한다.


구현

#include <stdio.h> #include <stdlib.h> #include <string.h> #define __INITIAL_SIZE 10 typedef struct __vector { int* data; int capacity; int length; } vector; int ensure_capacity(vector* v, int to_add) { return v->length + to_add < v->capacity; } void increase_capacity(vector* v) { v->data = (int*) realloc(v->data, 2 * v->capacity * sizeof(int)); v->capacity *= 2; } void initialize(vector* v) { v->data = (int*) malloc(__INITIAL_SIZE * sizeof(int)); v->capacity = __INITIAL_SIZE; v->length = 0; } void finalize(vector* v) { free(v->data); } void __add(vector* v, int element) { if (!ensure_capacity(v, 1)) increase_capacity(v); *(v->data + v->length++) = element; } int __get(vector* v, int index) { return *(v->data + index); } int __set(vector* v, int index, int element) { int tmp = *(v->data + index); *(v->data + index) = element; return index; } int __remove(vector* v, int index) { int tmp = *(v->data + index); int tail_length = v->length - index - 1; int* tail = (int*) malloc(tail_length * sizeof(int)); memcpy(tail, v->data + index + 1, tail_length * sizeof(int)); memcpy(v->data + index, tail, tail_length * sizeof(int)); free(tail); v->length--; return tmp; } void __print(vector* v) { printf("{"); for (int i = 0; i < v->length; i++) { printf("%d", *(v->data + i)); if (i < v->length - 1) printf(", "); } printf("}\n"); } int main() { vector val_v; vector* v = &val_v; initialize(v); __add(v, 10); __print(v); }









댓글
댓글쓰기 폼