2 분 소요



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, 백의 멤버 함수 구현을 포함하는 구현 파일



헤더파일은 위에서 언급한 bag class 이다.

  • 모든 클래스와 마찬가지로 멤버 함수의 실제 정의는 별도의 구현 파일에 배치

  • 백의 멤버 함수 정의는 bag1.cpp에 있다.



구현 세부 정보


이러한 아이디어를 사용하여 bag 클래스를 구현할 수 있는 전용 멤버 변수 목록을 작성한다. 두 개의 멤버 변수가 있어야 한다. 최대 20개의 정수를 담을 수 있는 가방을 만든다.

class bag
{
public:
     static const size_t CAPACITY = 20;
     ...
private:
     int  data[CAPACITY];
     size_t used;
};



bag::insert의 슈도코드


  1. assert(size() < CAPACITY); - precondition체크

  2. 데이터 배열의 적절한 위치에 new_entry를 배치

  3. 사용된 멤버 변수에 하나를 추가

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++ 클래스로 구현할 수 있다.

  • 클래스는 헤더 파일(문서 및 클래스 정의 포함) 및 구현 파일(멤버 함수 구현 포함)로 구현된다.

댓글남기기