더북(TheBook)

list_elements() 함수 템플릿은 시작 반복자와 끝 반복자로 지정한 범위에 있는 객체들을 한 줄에 여섯 개씩 출력한다. 이 함수는 main()에서 forward_list의 내용을 출력할 때 사용된다. main()의 첫 번째 동작은 cin에서 Box 객체에 사용할 크기를 읽는 것이다. istream_iterator<Box> 객체를 데이터 소스로, forward_list 객체 boxesfront_inserter를 데이터를 저장할 대상으로 사용해 copy() 알고리즘을 호출해서 입력을 처리한다. istream_iteratorBox.h에 정의된 operator>>() 함수를 호출해 Box 객체를 읽는다. front_inserter는 컨테이너의 push_front() 멤버를 호출하므로 forward_list와도 동작한다.

boxes 컨테이너의 원소들을 정렬한 후에 copy() 알고리즘을 사용해 ostream_iterator<Box> 객체 원소를 하나씩 전송하는 방식으로 Box 객체를 출력한다. 이는 단지 화면에 보여주기 위한 것이다. ostream_iterator 반복자는 Box.h에 정의된 operator<<() 함수를 호출한다. copy() 알고리즘을 이용한 출력은 한 줄에 몇 개까지 출력할지 제어할 수 없다는 제약이 있다. 따라서 나머지 코드에서는 출력에 list_elements() 템플릿 인스턴스를 사용했다. 다음은 또 하나의 forward_list로 선언한 more_boxes 컨테이너를 boxes 컨테이너 앞에 삽입하는 부분이다. 이는 boxesinsert_after() 멤버에 before_begin() 멤버가 반환한 반복자를 삽입 위치로 지정해서 처리한다.

다음 작업은 boxes를 정렬하고, more_boxes의 내용을 boxes로 병합하는 것이다. merge()는 두 컨테이너가 오름차순으로 정렬되어 있을 때만 동작하므로 merge()를 호출하기 전에 두 컨테이너 모두 정렬된 상태여야 한다. 이렇게 병합하면 boxes에 있는 원소와 more_boxes의 원소에 중복 복제본이 생기게 된다. boxes에서 unique() 멤버를 호출하면 인접 중복 원소들이 제거된다. 마지막 작업은 boxesremove_if() 멤버를 호출해 컨테이너에서 원소를 삭제하는 것이다. 삭제할 원소는 인수로 전달된 단항 조건자로 결정된다. 여기서는 max_v보다 작은 부피를 가진 원소에 대해 true를 반환하는 람다 표현식을 전달했다. max_v는 바깥 범위에서 값으로 캡처한 변수이므로 바깥 범위에서 다른 값을 설정하는 것도 가능하다.

예제 출력을 보면 모든 작업이 예상대로 동작한 것을 알 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.