티스토리 뷰
반응형
추가되는 사항
- C++에서 함수를 구별하는 방법은 함수의 이름 뿐만 아니라 인자값으로도 구별한다.
class Object { public: void foo() { std::cout << "foo()" << std::endl; } void foo(int i) { std::cout << "foo(int)" << std::endl; }; int main() { Object o; foo(); foo(10); return 0; }foo() foo(int)
이때 foo()와 foo(int)는 서로 다른 함수로 작동하며 컴파일러가 매개변수에 맞게 찾는다.
목표
- 함수 오버로딩을 이용하여 같은 기능을 하는 함수를 인자값만 달리하여 선언, 정의한다.
디자인
- 다음 멤버 함수가 추가됩니다.
- void add(int index, int element)
index번째에 element를 삽입한다. - void shiftLeft(int offset, int width)
offset번째 이후의 모든 원소를 앞으로 width칸 옮긴다. - void shiftRight(int offset, int width)
offset번째 이후의 모든 원소를 뒤로 width칸 옮긴다.
구현
#include <iostream>
#include <algorithm>
constexpr int INITIAL_SIZE = 10;
class vector {
private:
int* data;
int capacity;
int length;
bool ensure_capacity(int to_add) const {
return length + to_add < capacity;
}
void increase_capacity() {
auto tmp = data;
data = new int[capacity * 2];
std::copy(tmp, tmp + length, data);
delete[] tmp;
capacity *= 2;
}
void shiftLeft(int offset, int width) {
int tail_length = length - offset - width;
int* tail = new int[tail_length];
std::copy(data + offset + width, data + length, tail);
std::copy(tail, tail + tail_length, data + offset);
delete[] tail;
}
void shiftRight(int offset, int width) {
int tail_length = length - offset;
int* tail = new int[tail_length];
std::copy(data + offset, data + length, tail);
std::copy(tail, tail + tail_length, data + offset + width);
delete[] tail;
}
public:
vector() {
data = new int[INITIAL_SIZE];
capacity = INITIAL_SIZE;
length = 0;
}
vector(const vector& v) {
data = new int[v.capacity];
capacity = v.capacity;
length = v.length;
std::copy(v.data, v.data + v.length, data);
}
~vector() {
delete[] data;
}
void add(int element) {
if (!ensure_capacity(1))
increase_capacity();
*(data + length++) = element;
}
void add(int index, int element) {
if (!ensure_capacity(1))
increase_capacity();
shiftRight(index, 1);
*(data + index) = element;
length++;
}
int get(int index) const {
return *(data + index);
}
int set(int index, int element) {
auto tmp = *(data + index);
*(data + index) = element;
return tmp;
}
int remove(int index) {
auto tmp = *(data + index);
shiftLeft(index, 1);
length--;
return tmp;
}
void print() const {
std::cout << '{';
for (int i = 0; i < length; i++)
std::cout << *(data + i) << ((i < length - 1) ? ", " : "");
std::cout << '}' << std::endl;
}
};반응형
'C++ > C to C++' 카테고리의 다른 글
| [C to C++] 템플릿 (0) | 2019.02.01 |
|---|---|
| [C to C++] friend, 연산자 오버로딩 (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
TAG
- inline class
- f320k
- linaro
- cyanogenmod
- c++11
- CM10.2
- d802
- G2
- dokdo 4.0.3
- Java
- vector
- 포인터
- c++ struct
- dokdo-project
- LG
- rule_of_three
- c++ 상속
- Kotlin
- 객체지향
- f320s
- dokdo project
- C++
- CM11
- C++ 업캐스팅
- OOP
- C
- nodeal
- PipelineContext
- g2 korea
- rule_of_five
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
글 보관함
