티스토리 뷰
프로젝트 목표
- 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); }
'C++ > C to C++' 카테고리의 다른 글
[C to C++] friend, 연산자 오버로딩 (0) | 2019.01.31 |
---|---|
[C to C++] 함수 오버로딩 (0) | 2019.01.31 |
[C to C++] 생성자, 소멸자, 복사 생성자 (0) | 2019.01.29 |
[C to C++] 구조체를 클래스로 재정의하기 (0) | 2019.01.29 |
[C to C++] C++ 스타일에 맞춰 vector 작성하기 (0) | 2019.01.28 |
- Total
- Today
- Yesterday
- c++ struct
- C++ 업캐스팅
- LG
- rule_of_three
- c++11
- vector
- d802
- cyanogenmod
- inline class
- C
- dokdo project
- 포인터
- Java
- PipelineContext
- dokdo-project
- 객체지향
- dokdo 4.0.3
- f320k
- rule_of_five
- Kotlin
- G2
- nodeal
- CM10.2
- g2 korea
- c++ 상속
- linaro
- CM11
- C++
- OOP
- f320s
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |