forward_list


STL에는 리스트 자료구조를 사용하는 'std::list'라는 라이브러리가 이미 있지만, 이것은 양방향 리스트다. std::list는 사용하기 편하지만, 양방향으로 데이터를 탐색할 필요가 없을 때에는 메모리 사용이나 처리 속도 면에서 조금 아쉬운 점이 있다. 실제로는 양방향 리스트가 필요한 경우보다 단방향 리스트만으로 충분할 때가 많다. 이런 이유로  C++11에서는 단방향 리스트를 추가했다.

 

 

 

 

 

 

 

forward_list 사용하기


list 컨테이너와 forward_list는 크게 다른 부분이 없다. 다만, forward_list는 단방향 리스트라는 것과 다른 컨테이너에서 지원하는 일부 기능이 없다는 것을 유의해야 한다.

 

 

<forward_list 사용하기 예제>

 

 

 

 

 

 

 

 

데이터 추가하기


push_front를 사용하여 데이터를 추가했다. forward_list에는 push_front외에도 다음 함수들을 사용하여 데이터를 추가할 수 있다.

 

 

 

 

<insert_after, emplace_after, empace_front를 사용하는 간단한 예제>

 

 

 

 

 

 

 

 

 

데이터 삭제하기


forward_list에 저장된 데이터를 삭제할 때는 forward_list의 멤버 함수인 pop_front, erase_after를 사용한다.

 

 

 

 

<pop_front, erase_after 예제>

 

 

 

 

 

 

 

 

정렬


sort 함수를 사용하여 데이터를 정렬할 수 있다.

 

 

<정렬 예제>

 

 

 

 

 

 

 

 

중복 제거


unique 함수를 사용하면 같은 값을 가진 데이터를 제거할 수 있다. 단, unique는 사용하기 전에 먼저 정렬해야 한다는 점을 유의하기 바란다. 정렬되지 않은 상태에서 unique를 사용하면 정의되지 않은 행동을 한다.(정렬되지 않은 상태에서 중복된 데이터가 서로 붙어 있다면 정렬하지 않아도 된다).

 

 

 

<중복 제거 예제>

 

 

 

 

 

 

 

 

합치기


merge와 splice_after라는 두 가지 방법으로 forward_list 컨테이너 2개를 하나로 합칠 수 있다. merge는 단순히 2개의 컨테이너의 앞과 뒤를 붙이지만, splice_after는 위치와 범위까지 지정할 수 있다.

 

 

 

<merge 예제>

 

 

위 예제를 보면 두번째 merge에서 조건자를 사용했다. 조건자를 사용하면 item3와 item4를 합칠때 이 둘을 비교하면서 정렬하여 합친다. 단, 두 컨테이너의 데이터를 비교할 뿐, 자신의 컨테이너 데이터를 정렬하지 않는다는 점을 주의 한다.

 

 

 

 

<splice_after 예제>

 

forward_list는 list보다 성능 면에서 이점이 있지만, 사용 측면에서는 list보다 불편한 부분이 있다. 그러나 C언어와 비슷한 성능을 내고 싶다면 좋은 선택지가 될 수도 있다.

 

 

 

출처 : Thinking About C++ STL 프로그래밍 (최홍배 지음)

 

'C++ > STL' 카테고리의 다른 글

19. chrono  (0) 2017.10.25
18. unordered_map  (0) 2017.10.24
16. array  (0) 2017.10.20
15. 튜플(tuple)  (0) 2017.10.19
14. 메모리관리2 (unique_ptr)  (0) 2017.10.18

+ Recent posts