STL
자료구조 2015. 9. 4. 20:58STL 이란??
STL은 C++언어의 표준 템플릿 라이브러리( Standard Template Libaray)의 약자이다.
STL을 간단하게 말하면 일반적으로 많이 사용되는 자료구조와 알고리즘을 모은 라이브러리
STL은 1994년에 표준 위원회에서 초안이 통과되어서 만들어졌다.
STL중에서 가장 많이 사용하는 라이브러리는 컨테이너 라이브러리이다.
컨테이너는 int나 float등의 기본 자료형이나 구조체, 클래스 같은 사용자 정의형을 담는다.
STL의 컨테이너에는 list, vector, deque, map, set등이 있다.
list의 특징
1. 고정 길이인 배열에 비해서 가변적이다.
( 연결 리스트는 동적으로 크기를 변경 할 수있다.
2. 중간에 데이터 삽입, 삭제가 용이하다.
단점
배열에 비해서 데이터의 삽입과 삭제를 구현하기 어렵고 내부절차가 복잡하다.
배열은 랜덤하게 접근할 수 있지만, 연결 리스트는 랜덤하게 접근할 수 없다.
list를 사용해야 하는 경우
1. 저장할 데이터 개수가 가변적일 때
2. 중간에 데이터 삽입이나 삭제가 자주 일어날 때
3. 저장할 데이터 개수가 많으면서 검색을 자주 한다면 다른 컨테이너 라이브러리를 사용해야 한다.( 아주 많은 데이터를 저장하면서 특정 데이터를 자주 검색해야 할 때 list를 사용하면
검색 속도가 많이 느려지기때문에 이런 경우에는 map이나 set, hash_map을 사용해야 한다.
4. 데이터를 랜덤하게 접근하는 경우가 많지 않다.
(배열은 랜덤 접근이 가능하나 list는 순차 접근만 가능하다.
그래서 저장된 위치를 알더라도 반복자(iterator)를 통해서 접근해야 한다. )
list 사용방법
#include <list.h> 헤더를 걸어준다.
list< 자료형 > 변수 이름
list를 int형에 대해서 선언하기
list <int > list1;
선언후에 리스트를 사용하면 된다.(동적할당도 가능)
list< 자료형 >* 변수이름 = new list< 자료형 >;
list< int >* list2 = new <int>;
반복자 (iterator)
반복자는 포인터의 일반화된 개념이라고 볼 수 있다.
STL 컨테이너에 저장된 데이터를 순회할 수 있으며 컨테이너에서 특정 위치를 가리킨다.
포인터와 비슷하게 ++, -- 로 이동하고 대입과 비교도 가능하다.
반복자의 선언 형식
STL 컨테이너 <자료형>::iterator 변수 이름
begin()
첫 번재 요소를 가리키는 반복자를 리턴한다.
list<int> list;
list<int>::iterator iterFirst = list1.begin();
end()
마지막 요소를 가리킨다.
begin()과는 달리 end()는 마지막 요소 바로 다음을 가리킨다.
즉, 사용할 수 없는 영역을 가리키므로 end()위치의 반복자는 사용하지 못한다.
list<int>::iterator iterEnd = list1.end();
for문에서 list에 저장된 모든 요소에 접근하려고한다면 begin()과 end() 반복자를
사용한다.
for( list<int>::iterator iterPos = list1.begin(); iterPos != list1.end(); ++iterPos )
rbegin()
begin()과 비슷하다. 다른 점은 역방향으로 첫 번째 요소를 가리킨다.
그리고 사용하는 반복자도 다르다.
list::reverse_iterator IterPos = list1->rbegin();
rend()
end()와 비슷한데 다른 점은 역 방향으로 마지막 요소 다음을 가리킨다는 것이다.
list::reverse_iterator IterPos = list1.rend();
반복문으로 rebegin()과 rend()를 사용하여 list1의 각 데이터에 접근한다면..
for(list::reverse_iterator IterPos = list1.rebegin(); IterPos != list1.rend(); ++IterPos)
list의 주요 멤버
begin |
첫 번째 위치를 가리킨다. |
end |
마지막 위치의 다음을 가리킨다. |
rebegin |
역 방향으로 첫 번째 위치를 가리킨다. |
rend |
역 방향으로 마지막 위치를 가리킨다. |
push_front |
첫 번째 위치에 데이터 추가 |
pop_front |
첫 번째 위치의 데이터 삭제 |
push_back |
마지막 위치에 데이터 추가 |
pop_back |
마지막 위치의 데이터 삭제 |
front |
첫 번째 데이터의 참조 리턴 |
back |
마지막 데이터의 참조 |
clear |
저장하고 있는 모든 데이터 삭제 |
empty |
저장 데이터 유/무, 없으면 true 리턴 |
size |
저장하고 있는 데이터의 개수 리턴 |
insert |
지정된 위치에 삽입 |
erase |
지정된 범위에 있는 데이터 삭제 |
remove |
지정된 값과 일치하는 모든 데이터 삭제 |
remove_if |
함수객체의 조건을 만족하는 모든 데이터 삭제 |
sort |
데이터를 정렬한다. |
insert
insert는 지정된 위치에 삽입하며, 세 가지의 방식이 있다.
1. 지정된 위치에 삽입
iterator insert( iterator _Where, const Type& _Val );
ex) 100을 첫번재 위치에 삽입한다.
list<int>::iterator iterInsertPos = list1.begin();
list1.insert( iterInsertPos, 100 );
2. 지정된 위치에 지정된 개수만큼 삽입
void insert( iterator _Where, size_type _Count, const Type& _Val );
ex) // list1의 두 번째 위치에 200을 두번 추가
iterInsertPos = list1.begin();
++iterInsertPos;
list1.insert(iterInsertPos, 2, 200 );
3. 지정된 위치에 지정 범위에 있는 것을 삽입
template void insert ( iterator _Where, InputIterator _First, InputIterator _Last);
ex) list1의 두번째 위치에 list2의 모든 요소를 삽입한다.
list<int> list2;
list2.push_back(1000);
list2.push_back(2000);
list2.push_back(3000);
iterInsertPos = list1.begin();
list1.insert(++iterInsertPos, list2.begin(), list.end();
erase
지정한 위치의 요소를 삭제한다.
'자료구조' 카테고리의 다른 글
A-star 알고리즘 (0) | 2015.08.26 |
---|---|
AVL 트리 (0) | 2015.08.24 |
Red Black Tree (0) | 2015.08.19 |
이진 트리(Binary Tree) (0) | 2015.08.17 |
트리 (0) | 2015.08.17 |