[자료구조] Container Classes
Container class
Container class는 항목 모음을 보유할 수 있는 data type이다. C++에서 컨테이너 클래스는 항목을 추가, 제거 및 검사하는 멤버 함수와 함께 클래스로 구현될 수 있다.
Bags
예시를 위해 bag이라는 걸 생각해 보자.
- 처음에는 가방이 비어있다. 이는 초기상태다.
- 우리는 가방에 숫자를 넣을 수 있다. 여러개를 넣을 수 있다.
- 동일한 숫자를 두번 이상 넣을 수 있다.
- 가방안에 지정한 번호가 있는지(몇개) 확인하고 제거할 수 있다.
- 가방안에 몇개의 숫자가 있는지 확인할 수 있다.
Bag class
위에서 언급한 가방을 c++ class로 정의해보자
class bag
{
public:
bag( );
void insert(...
void remove(...
//...등등
private:
// 조금 뒤에 다룰 예정이다.
};
class 정의는 다음을 포함한다.
- 정의의 제목
- 생성자 프로토타입
- 대중을 위한 프로토타입
- 멤버 함수
- 비공개 멤버 변수
Bag’s Default Constructor
bag::bag( )
// Postcondition : 가방이 초기화 됬다.
// 이제 비어있다.
{
}
Insert funtion
void bag::insert(int new_entry)
// Precondition: 가방이 가득 차지 않았다.
// Postcondition: new_entry의 새 복사본이 bag에 추가됬다.
{
}
Size funtion
int bag::size( ) const
// Postcondition: 리턴벨류는 가방의 정수의 개수다.
{
}
std
#include <cstdlib>
std::size_t bag::size( ) const
// Postcondition: The return value is the number
// of integers in the bag.
{
}
int 대신 std::size_t를 사용
- std안에 저장되어있는 타입으로 int와 같지만 array의 사이즈 등 명시적인 사용이다.
Occurrences funtion
std::size_t bag::occurrences(int target) const
// Postcondition: 리턴 값은 백에 있는 대상의 복사본 수다.
{
}
Remove funtion
void bag::remove(int target)
// Postcondition: 대상이 가방 안에 있으면
// 대상 복사본 하나가 가방에서 제거된다.
// 그렇지 않으면 가방은 변경되지 않는다.
{
}
Using Bag in a Program
다음은 새 백 클래스를 사용하는 프로그램의 일반적인 코드다.
bag ages;
// 세 자녀의 나이를 기록하십시오.
ages.insert(4);
ages.insert(8);
ages.insert(4);
-
새 백 클래스를 작성하는 프로그래머는 두 개의 파일을 작성해야 한다.
-
문서 및 클래스 정의가 포함된 헤더 파일인 bag1.h
-
bag1.cpp, 백의 멤버 함수 구현을 포함하는 구현 파일
header
헤더파일은 위에서 언급한 bag class 이다.
-
모든 클래스와 마찬가지로 멤버 함수의 실제 정의는 별도의 구현 파일에 배치
-
백의 멤버 함수 정의는 bag1.cpp에 있다.
구현 세부 정보
이러한 아이디어를 사용하여 bag 클래스를 구현할 수 있는 전용 멤버 변수 목록을 작성한다. 두 개의 멤버 변수가 있어야 한다. 최대 20개의 정수를 담을 수 있는 가방을 만든다.
class bag
{
public:
static const size_t CAPACITY = 20;
...
private:
int data[CAPACITY];
size_t used;
};
bag::insert의 슈도코드
-
assert(size() < CAPACITY); - precondition체크
-
데이터 배열의 적절한 위치에 new_entry를 배치
-
사용된 멤버 변수에 하나를 추가
data[used] = new_entry;
used++;
or
data[ used++] = new_entry;
insert full code
typedef int value_type ;
void bag::insert(const value_type& entry)
{
assert(size() < CAPACITY) ;
data[ used++] = entry;
}
erase_one full code
bool bag::erase_one(const value_type& target)
{
size_type index = 0;
while((index < used) && (data[index] != target))
++index;
if(index == used)
return false;
--used;
data[index] = data[used];
return ture;
}
+= operator full code
#include <algorithm>
#include <cassert>
void bag::operator +=(const bag& addend)
{
assert(size() +addend.size() <= CAPACITY);
copy(addend.data, addend.data+addend.used,
data+used) ;
used += addend.used ;
}
copy는 lib함수다 아니면 for문을 사용해도 된다.
Summary
-
컨테이너 클래스는 항목 컬렉션을 보유할 수 있는 클래스다.
-
컨테이너 클래스는 C++ 클래스로 구현할 수 있다.
-
클래스는 헤더 파일(문서 및 클래스 정의 포함) 및 구현 파일(멤버 함수 구현 포함)로 구현된다.
댓글남기기