본문 바로가기

Windows Developer/C++

[C++]STL에 대해서(보충)

[출처]http://blog.naver.com/hkn10004/20103075766
STL은 C++ 응용 프로그램의 고효율성을 위해 설계 되었다.
STL의 구성요소들과 용어들에 대해 알아보자.

컨테이너 : 벡터, 리스트, 큐, 맵 같은 전통적인 데이터 추상과 조직화 구조이다.
반복자 : iterator는 컨테이너 안의 요소들에 대한 포이터라고 생각하면 된다.
알고리즘 : 반복자에 대한 작동하는 독립형 함수들의 형태. 특수화된 멤버 함수들로 컨테이너들에 대한 가장 기본적인 작업 들을 수행한다.

컨테이너를 다룰때에는 범위를 얻는 데 쓰이는 메서드들을 알아야 한다.
begin()과 end()가 있는데 컨테이너의 시작과 끝을 알 수 있다.

컨테이너
[][][][].....[]||
begin().......end()
여기서 end()는 마지막 요소 다음||을 가리키고 있다고 알아두자.
STL 컨테이너들은 정보를 참조(by reference)가 아니라 값(by value)로 전달한다.

1. 벡터


STL Vector의 특징
1. 동적으로 크기를 변경할 수 있는 배열이다.
2. 현재 필요한 양 이상의 메모리를 할당할 수 있다.
3. 벡터의 끝에 하나의 요소를 추가할 수 있다.


reserve(n) : vector안의 버퍼의 크기를 준비 한다.
capacity() : 할달된 버퍼크기 리턴.
참고 : capacity()==reserve() 상태에서 새 요소를 추가하면 메모리 재할당이 일어나고 모든 반복자들이 무효화된다.
push_back() : 데이터 삽입
max_size() : 하나의 벡터에 할당될 수 있는  최대 메모리양


2. 리스트





기본 STL 구조체들 중 가장 널리 쓰이는 것은 아마도 STL list 일 것이다. list는 이중 연결 리스트로 구현되었다. 따라서 어떤 요소 삽입이나 삭제도 어떠한 루프나 검색과정을 수반하지 않고 수행된다. 대신 벡터나 데크에서 처럼 특정 요소에 접근하는 것은 불가능하다.(요소들을 순차적으로 거쳐가야 한다.)

CItem이라는 객체를 만들어 100개를 생성하고 그 중 2번째 아이템을 삭제해 보았다.
STL 컨테이너의 대부분은 값 전달 방식이기 때문에 덩치가 큰 구조체나 객체의 복사에 따른 성능 감소를 피하기 위해 객체 포인터를 넘겨주도록 해야 한다.
new를 하여 100개의 객체를 메모리에 생성해 주었기 때문에 꼭 delete로 객체를 소거해 주자.
컨테이너 내에서 메모리 할당을 해준게 아니기 때문에 우리가 생성해준 메모리는 우리가 소거해 주어야 한다. 컨테이너 자체는 자신이 가지고 있는 데이터가 어떤 것인지 알지 못하므로 컨테이너는 자동으로 해제해 주지 않는다.
여기서 우리가 생성해준 것은 포인터들이기 때문에 컨테이너를 복사할 때에도 객체 자체가 아니라 포인터들만 복사가 된다. 동일한 객체를 가리키는 포인터가 여러 개 존재한다는 것은 메모리 측면에서 매우 위험한 일이다. 되도록이면 포인터를 사용한 컨테이너 간의 복사 알고리즘은 사용하지 말자. 혹 사용할 일이 생긴다면 포인터 관리에 세심한 주의를 기울여야 할 것이다.

erase() : 다음의 유효한 위치를 리턴
도중에 2번 아이템을 삭제해 주었기 때문에 erase()를 적절히 사용해 주자.


3.맵



맵은 키-값 형태로 저장되는 컨테이너이다.

isMap::value_type 이라는 새로운 중간 데이터형은 컨테이너 안에 키-값 형태로 저장되는 요소들을 나타내기 위한 것이다.
insert() : 요소(키-값)를 컨테이너에 삽입
value_type의 first는 key값을 담고 있다.
value_type의 second는 value값을 담고 있다.
find_if() : 범용적인 STL 검색 알고리즘. (검색시작 반복자, 검색종료 반복자, 검색성공 여부 판단 객체 지정
STL map의 특징
1. 요소를 삽입할 때 자동적으로 정렬한다.
2. 키에 의해 정렬된 상태를 유지한다.
3. find() 함수로 특정 키에 해당하는 요소를 찾는 부분은 정렬된 키에 인해 수행 시간은 0(log n)이다.
4. erase()함수가 다음의 유효위치를 돌려주지 않는다(속도상의 문제?)


루프 안에서 항상 선행 증가를 사용하는 것이 좋은 이유 : 효율성 때문에
후행 증가 연산자는 변수의 이전 값을 돌려주므로 이전 값을 담을 임시적인 변수를 만들고 파괴하는 과정이 일어나게 된다.

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

[C++] 초기화 리스트(Initialize List)  (1) 2010.07.26
[C++] 형변환 연산자  (0) 2010.07.26
[C++] 가상함수  (0) 2010.07.26
[C++]템플릿(template)  (0) 2010.07.20
[C++]STL 표준 C++ 라이브러리  (0) 2010.07.20