연결리스트의 특징
1. 고정 길이인 배열에 비해 길이가 가변적이다. 2. 중간에 데이터 삽입, 삭제가 용이하다. |
STL list를 사용하면 좋은 점
STL을 사용하지 않는다면 C/C++ 언더, 자료구조를 공부하고 필요한 자료구조를 직접 만들어 사용해야 한다. 직접 만들어 사용하면 여러 번 되풀이(프로젝트나 회사가 바뀌면)하여 만들어야 하므로 불필요한 시간을 소비하고, 연결 리스트 자료구조를 잘못 구현하여 버그를 만들 위험이 있고, 개인마다 구현 방법이 다르므로 사용이나 유지보수 측면에서 불편하다.
STL list를 사용하면 연결 리스트를 따로 만들어야 하는 시간을 절약할 수 있고, 이미 검증되어 있으므로 안전하고, 표준 라이브러리이므로 사용방법이 언제나 같아서 사용 및 유지보수가 좋아진다.
다만, list를 사용할 때는 특성을 잘 파악하여 사용해야 한다. list를 적합하지 않은 곳에 사용하면 성능의 하락 및 시스템 에러를 유발할 위험이 생긴다. |
STL에 버그가 있다?
보통 STL의 특징을 제대로 파악하지 못하고 사용해서 일어난 문제들이 많다. 만약 정말 STL에 버그가 있다면 찾아서 다른 프로그래머들에게 도움을 주고 큰 버그를 찾은 스타가 되어보자. |
list를 사용해야 하는 경우
1. 저장할 데이터 개수가 가변적이다. 2. 중간에 데이터 삽입이나 삭제가 자주 일어난다. 3. 저장할 데이터 개수가 많으면서 검색을 자주 한다면 다른컨테이너 라이브러리를 사용해야 한다. - 아주 많은 데이터를 저장하면서 특정 데이터를 자주 검색해야 할때 list를 사용하면 검색 속도가 많이 느려진다. 이런경우에는 map이나 set. hash_map을 사용해야 한다. 4. 데이터를 랜덤하게 접근하는 경우가 많지 않다. - list는 순차 접근만 가능하다. 그래서 저장된 위치를 알더라도 반복자를 통해서 접근해야 한다.
|
list 사용방법
리스트의 헤더파일 포함
#include <list>
list 형식
list< 자료형 > 변수이름
list를 int 형에 대해 선언한다.
list<int> list1;
선언 후에는 리스트를 사용하면 된다, 물론 동적 할당도 가능하다.
list<int>* list2 = new list<int>
list의 네임스페이스
std::list<int> list;
반복자(iterator)
list 에 저장된 데이터에 접근하려면 반복자를 사용해야 한다. 반복자는 포인터의 일반화된 개념이라고 봐도 된다. STL 컨테이너에 저장된 데이터를 순회할 수 있으며 컨테이너에서 특정 위치를 가리킨다. 포인터와 비슷하게 ++와 --로 이동하고 대입과 비교도 가능하다.
반복자의 선언 형식은 다음과 같다
STL의 컨테이너< 자료형 >::iterator 변수이름;
begin()
첫 번째 요소를 가리키는 반복자를 리턴한다.
예) list<int>::iterator iterFirst = list1.begin();
end()
마지막 요소를 가리킨다. 주의할 점은 begin()과 달리 end()는 마지막 요소의 바로 다음을 가리킨다. 즉 사용할 수 없는 영역을 가리키므로 end()위치의 반복자를 사용하지 못한다.
예) list<int>::iterator iterEnd = list1.end();
for문에서 list에 저장된 모든 요소 접근하기
rbegin()
begin()과 비슷하지만 다른 점은 역 방향으로 첫 번째 요소를 가리킨다. 사용하는 반복자도 다르다.
예) list<int>::reverse_iterator iterPos = list1->rbegin();
rend()
end()와 비슷하지만 다른 점은 역 방향으로 마지막 요소 다음을 가리킨다는 것이다.
예) list<int>::reverse_iterator iterPos = list1->rend();
for문에서 각데이터 접근하기
리스트의 주요 멤버들
예제 코드
<데이터를 추가 및 삭제, front, back 사용>
<insert>
<erase>
-erase는 지정된 범위에 있는 데이터를 삭제하며, 두 가지 방식이 있다.
<list 반복자의 랜덤 접근>
- list는 랜덤 접근이 안되기 때문에 원하는 위치까지 이동하기 위해서는 ++iterPos 처럼 하나씩 이동해야 한다.
다음은 반복문에서 list의 데이터를 삭제하면서 반복하는 경우 조심하지 않으면 버그가 발생한다.
<remove>
- list에서 지정한 값과 일치하는 모든 데이터 삭제.
다음은 remove의 사용법에 대한 코드이다.
<sort>
- 데이터들을 정렬한다. STL에 정의된 방식으로 정렬하거나 사용자가 정의한 방식으로 정렬할 수 있다.
<그외 설명하지 않은 list의 멤버들>
출처 : Thinking About C++ STL 프로그래밍 (최홍배 지음)
'C++ > STL' 카테고리의 다른 글
6. 셋(set) (0) | 2017.09.27 |
---|---|
5. 맵(map) (0) | 2017.09.26 |
4. 해시 맵(hash_map) (0) | 2017.09.25 |
3. 덱(deque) (0) | 2017.09.22 |
2. 백터(vector) (0) | 2017.09.21 |