stl vector, list, map

60
STL vector list map NHN NEXT 남현욱 맛보기

Upload: nam-hyeonuk

Post on 04-Jul-2015

1.138 views

Category:

Software


3 download

DESCRIPTION

STL 생 초짜를 위한 STL 맛보기 슬라이드

TRANSCRIPT

Page 1: Stl vector, list, map

STLvector list map

NHN NEXT남현욱

맛보기

Page 2: Stl vector, list, map

STL이 뭘까?

◆STL 은 Standard Template Library의 약자로, ‘많이 사용되는 자료구조와 알고리즘을 모아 놓은 라이브러리’라고 보면 된다.

◆링크드 리스트, 동적 배열, 트리, 스택, 큐 등 자료구조부터 검색, 정렬 등의 알 고리즘에 이르기까지 일반적으로 널리 이용되고 매번 구현이 비슷비슷한데 이 걸 매번 다시 만들어 쓰기 귀찮으니 모든 종류의 자료형에 대해 일반적으로 동작하도록 잘 만들어 둔 것이 바로 STL.

Page 3: Stl vector, list, map

STL의 구성요소

Page 4: Stl vector, list, map

STL의 구성요소

컨테이너Containers

알고리즘Algorithms어댑터

Adaptors

할당기Allocators

반복자Iterators

함수 객체Functors

Page 5: Stl vector, list, map

STL의 구성요소

뭔가 너무 많고 복잡하다

Page 6: Stl vector, list, map

STL의 구성요소

어려우니까 우선 위에서 제시한 요소들 중 가장 중요한

◆ 컨테이너 ( Containers )◆ 반복자 ( Iterators )◆ 알고리즘 ( Algorithms )

세 가지를 중심으로 vector, list, map에 대해 알아 보자

Page 7: Stl vector, list, map

컨테이너

Page 8: Stl vector, list, map

컨테이너 Containers

컨테이너= 그릇, 통

즉, 동일한 타입의 어떤 자료를 저장하고 관리하는 역할을 하는 것을 컨테이너라고 한다.

Page 9: Stl vector, list, map

컨테이너 Containers

◆시퀀스 컨테이너 ( Sequence Container ) -자료의 선형적인 집합. STL에서는 vector, list 등을 제공한다.

◆연관 컨테이너 ( Associative Container ) -자료를 일정한 규칙에 따라 조직화하여 관리한다. STL에서는 set,map

등을 제공한다.

◆어댑터 컨테이너 ( Adapter Container ) -시퀀스 컨테이너를 변형하여 자료를 미리 일정하게 정해진 방식에 따라 관리한다. 자료를 넣고 빼는 순서를 외부에서 마음대로 조작할 수 없다. STL에서는 stack, queue등을 제공한다.

Page 10: Stl vector, list, map

컨테이너 Containers

우선 제일 쉬운 vector를 통해 컨테이너 맛만 살짝 보자

Page 11: Stl vector, list, map

컨테이너 Containers

vector쉽게 말해서 임의 타입에 대한 동적 배열이라고 보면 된다. 들어간 요소의 개수에 맞게 알아서 메모리를 재할당해준다.

vector<Type> name(n);

의 형태로 Type형의 n개 크기 동적배열(vector) name을 생성할 수 있다.

Page 12: Stl vector, list, map

컨테이너 Containers

예시)

Page 13: Stl vector, list, map

컨테이너 Containers

예시)결과

Page 14: Stl vector, list, map

컨테이너 Containers

예시)결과

입력받은 크기대로 배열을 할당하여 쓸 수 있으며, 일반적인 배열을 쓰는 용법과 마찬가지로 사용할 수 있음을 알 수 있다.

또 실행 중간에 size() 함수를 이용해 현재 할당된 크기가 얼마나 되는지도 확인할 수 있다.

Page 15: Stl vector, list, map

반복자

Page 16: Stl vector, list, map

반복자 Iterators

vector는 단순해서 반복자 없이도 어느 정도 사용할 수 있지만,다른 복잡한 컨테이너들을 다루기 위해서는 반복자가 필수적이다.

다른 컨테이너들을 배우기 전에 우선 반복자에 대해서 알아보자.

Page 17: Stl vector, list, map

반복자 Iterators

그런데 반복자의 개념에 대해 논하기 전에 먼저,

컨테이너를 순회하는 방법에는 뭐가 있을까?

Page 18: Stl vector, list, map

반복자 Iterators

동적 배열 요소 순회하며 출력

링크드 리스트요소 순회하며 출력

Page 19: Stl vector, list, map

반복자 Iterators

동적 배열 요소 순회하며 출력

링크드 리스트요소 순회하며 출력

컨테이너 종류가 달라지면 순회하는 방법도 달라진다.

Page 20: Stl vector, list, map

반복자 Iterators

동적 배열 요소 순회하며 출력

링크드 리스트요소 순회하며 출력

컨테이너 종류가 달라지면 순회하는 방법도 달라진다.

근데 수많은 컨테이너들을모두 순회방법을 다르게 만들자니너무 복잡하고 어렵다!

Page 21: Stl vector, list, map

반복자 Iterators

그래서 등장한 것이 바로 반복자

Page 22: Stl vector, list, map

반복자 Iterators

반복자의 특징

1) 컨테이너의 요소 하나를 가리키는 기본적인 역할을 한다.

2) 가리키는 지점의 요소를 읽고 쓸 수 있다. → 내용을 읽는 * 연산자가 정의된다.

3) 증감에 의해 주변 요소로 이동할 수 있다. → ++, -- 등의 연산자가 정의된다.

4) 반복자끼리 대입,비교가 가능해야 한다. → 대입, 비교 연산자가 정의된다.

Page 23: Stl vector, list, map

반복자 Iterators

반복자의 특징

1) 컨테이너의 요소 하나를 가리키는 기본적인 역할을 한다.

2) 가리키는 지점의 요소를 읽고 쓸 수 있다. → 내용을 읽는 * 연산자가 정의된다.

3) 증감에 의해 주변 요소로 이동할 수 있다. → ++, -- 등의 연산자가 정의된다.

4) 반복자끼리 대입,비교가 가능해야 한다. → 대입, 비교 연산자가 정의된다.

...어라? 포인터랑 비슷하네?

Page 24: Stl vector, list, map

반복자 Iterators

반복자는 포인터의 일반화된 개념이라고 생각하면 이해하기 편하다

Page 25: Stl vector, list, map

반복자 Iterators

가장 간단한 vector 컨테이너를 통해 반복자의 활용 방법을 알아보자

Page 26: Stl vector, list, map

반복자 Iterators

가장 간단한 vector 컨테이너를 통해 반복자의 활용 방법을 알아보자

배열 ari의 0번째 요소부터 ari의 5번째 요소 직전까지 연속한 요소들로 vi를 초기화 하겠다는 구문

Page 27: Stl vector, list, map

반복자 Iterators

가장 간단한 vector 컨테이너를 통해 반복자의 활용 방법을 알아보자

배열 ari의 0번째 요소부터 ari의 5번째 요소 직전까지 연속한 요소들로 vi를 초기화 하겠다는 구문

vector 컨테이너의 반복자를 선언하는 방법. 기타 컨테이너도 방식은 동일하다.vector<Type>::iterator Name;의 형태로 선언.

Page 28: Stl vector, list, map

반복자 Iterators

가장 간단한 vector 컨테이너를 통해 반복자의 활용 방법을 알아보자

배열 ari의 0번째 요소부터 ari의 5번째 요소 직전까지 연속한 요소들로 vi를 초기화 하겠다는 구문

vector 컨테이너의 반복자를 선언하는 방법. 기타 컨테이너도 방식은 동일하다.vector<Type>::iterator Name;의 형태로 선언.

for문을 보면 생소한 vi.begin() , vi.end()라는 문구가 나온다. vi.begin()은 컨테이너의 가장 첫번째 요소를 가리키는 것이고, vi.end()는 컨테이너의 마지막 요소의 다음 요소를 가리키는 것이다.

즉 vi.begin()에서 시작하여 반복자 it를 vi.end()가 될 때까지 반복문을 돌리면 컨테이너의 모든 요소를 내부 구현 방식에 상관없이 일관성 있게 순회할 수 있는 것이다.

Page 29: Stl vector, list, map

반복자 Iterators

가장 간단한 vector 컨테이너를 통해 반복자의 활용 방법을 알아보자

배열 ari의 0번째 요소부터 ari의 5번째 요소 직전까지 연속한 요소들로 vi를 초기화 하겠다는 구문

vector 컨테이너의 반복자를 선언하는 방법. 기타 컨테이너도 방식은 동일하다.vector<Type>::iterator Name;의 형태로 선언.

for문을 보면 생소한 vi.begin() , vi.end()라는 문구가 나온다. vi.begin()은 컨테이너의 가장 첫번째 요소를 가리키는 것이고, vi.end()는 컨테이너의 마지막 요소의 다음 요소를 가리키는 것이다.

즉 vi.begin()에서 시작하여 반복자 it를 vi.end()가 될 때까지 반복문을 돌리면 컨테이너의 모든 요소를 내부 구현 방식에 상관없이 일관성 있게 순회할 수 있는 것이다.

결과

Page 30: Stl vector, list, map

반복자 Iterators

이제 반복자의 개념도 대충 알았으니

vector보다 조금 더 복잡한

list 컨테이너에 대해 알아보자

Page 31: Stl vector, list, map

반복자 Iterators

listlist는 이중 링크드 리스트로 구현된 컨테이너다. 흔히 알려진 것처럼 삽입, 삭제는 굉장히 빠르지만 요소를 순회하는 것은 느린 자료구조이다.

list<Type> Name;

의 형태로 Type 형태의 list(이중 링크드 리스트) Name을선언할 수 있다.

Page 32: Stl vector, list, map

반복자 Iterators활용 예시

Page 33: Stl vector, list, map

반복자 Iterators활용 예시

push_back()함수를 통해 list의 맨 마지막에 요소를 삽입할 수 있다. 이중 연결리스트이므로 O(1) 시간 만에 삽입 연산이 수행된다.

Page 34: Stl vector, list, map

반복자 Iterators활용 예시

push_back()함수를 통해 list의 맨 마지막에 요소를 삽입할 수 있다. 이중 연결리스트이므로 O(1) 시간 만에 삽입 연산이 수행된다.

list<Type>::iterator를 통해 vector와 완전히 동일한 방식으로 내부 요소를 모두 순회하고 있다. 이렇게 서로 다른 내부 구조를 지닌 컨테이너라 할 지라도 동일하게 일반화된 방법으로 순회할 수 있다는 것이 STL의 강점이다.

Page 35: Stl vector, list, map

반복자 Iterators활용 예시

push_back()함수를 통해 list의 맨 마지막에 요소를 삽입할 수 있다. 이중 연결리스트이므로 O(1) 시간 만에 삽입 연산이 수행된다.

list<Type>::iterator를 통해 vector와 완전히 동일한 방식으로 내부 요소를 모두 순회하고 있다. 이렇게 서로 다른 내부 구조를 지닌 컨테이너라 할 지라도 동일하게 일반화된 방법으로 순회할 수 있다는 것이 STL의 강점이다.

Page 36: Stl vector, list, map

반복자 Iterators

mapmap은 연관이 있는 두 개의 값을 키(key)와 값(value)의 쌍으로 관리

하는 컨테이너다.

map은 저장되는 데이터가 항상 정렬이 되어 있다는 특징을 갖고 있다.

따라서 많은 크기의 데이터를 저장하고, 검색을 빨리 해야하는 경우

map을 굉장히 유용하게 사용할 수 있다.

Page 37: Stl vector, list, map

반복자 Iterators

그런데 이 때 map에서 key와 value가

의미하는 것이 각각 뭘까?

Page 38: Stl vector, list, map

반복자 Iterators

key는 정렬과 참조를 위한 정보

value는 실제로 저장하고 싶은 자료

라고 생각하면 편하다.

그런데 이 때 map에서 key와 value가

의미하는 것이 각각 뭘까?

Page 39: Stl vector, list, map

반복자 Iterators

key는 정렬과 참조를 위한 정보

value는 실제로 저장하고 싶은 자료

라고 생각하면 편하다.

예를 들어 NHN NEXT 학생들의

정보를 저장한다고 하면,

key는 학생들의 학번

value는 각 학생과 관련된 정보

가 될 것이다.

그런데 이 때 map에서 key와 value가

의미하는 것이 각각 뭘까?

Page 40: Stl vector, list, map

반복자 Iterators

그런데 잠깐,

지금까지는 하나의 값만 다루는 컨테이너를 썼는데

map은 두 개의 값을 같이 다룬다.

어떻게 두 개의 값을 같이 다룰 수 있지?

Page 41: Stl vector, list, map

반복자 Iterators

그런데 잠깐,

지금까지는 하나의 값만 다루는 컨테이너를 썼는데

map은 두 개의 값을 같이 다룬다.

어떻게 두 개의 값을 같이 다룰 수 있지?

STL에서는 이를 위해 pair라는 자료형을 제공한다.

Page 42: Stl vector, list, map

반복자 Iterators

pairpair는 두 개의 값을 하나로 묶어 관리할 수 있게 해준다.

pair<Type1, Type2> Name;

의 형태로 Type1 형태의 자료와 Type2 형태의 자료를 하나로 묶은 쌍

Name을 선언할 수 있다.

Page 43: Stl vector, list, map

반복자 Iterators활용 예시

Page 44: Stl vector, list, map

반복자 Iterators활용 예시

int 타입과 string 타입 두 개를 묶은 한 쌍을 나타내는 pair인 student의 선언

Page 45: Stl vector, list, map

반복자 Iterators활용 예시

int 타입과 string 타입 두 개를 묶은 한 쌍을 나타내는 pair인 student의 선언

pair자료형에서 first와 second는 각각 pair의 첫 번째 요소와 두 번째 요소를 가리킨다.

Page 46: Stl vector, list, map

반복자 Iterators활용 예시

int 타입과 string 타입 두 개를 묶은 한 쌍을 나타내는 pair인 student의 선언

pair자료형에서 first와 second는 각각 pair의 첫 번째 요소와 두 번째 요소를 가리킨다.

실행 결과는 간단하므로 생략

Page 47: Stl vector, list, map

반복자 Iterators

◆map은 pair를 이용해 한 쌍으로 묶은 정보( < key, value >의 형태 ) 를 이용해 데이터를 저장한다.

◆map은 내부적으로 균형잡힌 이진 트리(balanced binary tree)로 구현되어 있다(정확히는 레드-블랙 트리 Red-Black tree).

이 때 key는 이진 트리를 정렬하고 이진 트리의 각 요소에 접근하기 위한 값으로 쓰이며, value는 실제로 저장된 값으로 쓰인다.

따라서 당연히 map에서 key는 절대 중복되어서는 안 된다.

◆균형잡힌 이진 트리는 검색 속도가 O(log n)임이 보장되기 때문에 map이 굉장히 빠른 검색 속도를 가지는 것이다.

Map은 이런 것이다!

Page 48: Stl vector, list, map

반복자 Iterators

활용 예시

Page 49: Stl vector, list, map

반복자 Iterators

활용 예시

각 도시의 이름을 key로, 인구수를 value로 하는 map m을 선언했다.

Page 50: Stl vector, list, map

반복자 Iterators

활용 예시

각 도시의 이름을 key로, 인구수를 value로 하는 map m을 선언했다.

insert 함수를 통해 한 쌍의 데이터(pair)를 map에 저장할 수 있다. map은 내부적으로 자료를 정렬하여 관리하므로 이 자료가 어느 위치에 저장될지는 알 수 없다.

Page 51: Stl vector, list, map

반복자 Iterators

활용 예시

각 도시의 이름을 key로, 인구수를 value로 하는 map m을 선언했다.

insert 함수를 통해 한 쌍의 데이터(pair)를 map에 저장할 수 있다. map은 내부적으로 자료를 정렬하여 관리하므로 이 자료가 어느 위치에 저장될지는 알 수 없다.

왼쪽과 같이 익숙한 배열의 형태로도 데이터를 삽입할 수 있다. map[key] = value; 의 형태로 쓰면 map에 key,value 쌍의 데이터가 삽입되고, map[key]라고 쓰면 해당 map에서 key에 해당하는(key와 한 쌍인) value 값을 얻을 수 있다.

Page 52: Stl vector, list, map

반복자 Iterators

활용 예시

각 도시의 이름을 key로, 인구수를 value로 하는 map m을 선언했다.

insert 함수를 통해 한 쌍의 데이터(pair)를 map에 저장할 수 있다. map은 내부적으로 자료를 정렬하여 관리하므로 이 자료가 어느 위치에 저장될지는 알 수 없다.

왼쪽과 같이 익숙한 배열의 형태로도 데이터를 삽입할 수 있다. map[key] = value; 의 형태로 쓰면 map에 key,value 쌍의 데이터가 삽입되고, map[key]라고 쓰면 해당 map에서 key에 해당하는(key와 한 쌍인) value 값을 얻을 수 있다.

지울 때는 erase 함수를 쓰며, 반복자 또는 특정 key값을 통해 해당 key에 해당하는 value 한 쌍을 삭제할 수 있다. value 값으로는 삭제할 수 없다. map의 삽입, 삭제 및 참조의 모든 기준은 key이다.

Page 53: Stl vector, list, map

반복자 Iterators

활용 예시

각 도시의 이름을 key로, 인구수를 value로 하는 map m을 선언했다.

insert 함수를 통해 한 쌍의 데이터(pair)를 map에 저장할 수 있다. map은 내부적으로 자료를 정렬하여 관리하므로 이 자료가 어느 위치에 저장될지는 알 수 없다.

왼쪽과 같이 익숙한 배열의 형태로도 데이터를 삽입할 수 있다. map[key] = value; 의 형태로 쓰면 map에 key,value 쌍의 데이터가 삽입되고, map[key]라고 쓰면 해당 map에서 key에 해당하는(key와 한 쌍인) value 값을 얻을 수 있다.

지울 때는 erase 함수를 쓰며, 반복자 또는 특정 key값을 통해 해당 key에 해당하는 value 한 쌍을 삭제할 수 있다. value 값으로는 삭제할 수 없다. map의 삽입, 삭제 및 참조의 모든 기준은 key이다.

다른 컨테이너와 거의 완전히 똑같은 방식으로 반복자를 이용해 컨테이너 내부의 모든 요소를 순회할 수 있다.

Page 54: Stl vector, list, map

반복자 Iterators

활용 예시

각 도시의 이름을 key로, 인구수를 value로 하는 map m을 선언했다.

insert 함수를 통해 한 쌍의 데이터(pair)를 map에 저장할 수 있다. map은 내부적으로 자료를 정렬하여 관리하므로 이 자료가 어느 위치에 저장될지는 알 수 없다.

왼쪽과 같이 익숙한 배열의 형태로도 데이터를 삽입할 수 있다. map[key] = value; 의 형태로 쓰면 map에 key,value 쌍의 데이터가 삽입되고, map[key]라고 쓰면 해당 map에서 key에 해당하는(key와 한 쌍인) value 값을 얻을 수 있다.

지울 때는 erase 함수를 쓰며, 반복자 또는 특정 key값을 통해 해당 key에 해당하는 value 한 쌍을 삭제할 수 있다. value 값으로는 삭제할 수 없다. map의 삽입, 삭제 및 참조의 모든 기준은 key이다.

다른 컨테이너와 거의 완전히 똑같은 방식으로 반복자를 이용해 컨테이너 내부의 모든 요소를 순회할 수 있다.

왜 이런 결과가 나올까?

Page 55: Stl vector, list, map

반복자 Iterators

활용 예시

각 도시의 이름을 key로, 인구수를 value로 하는 map m을 선언했다.

insert 함수를 통해 한 쌍의 데이터(pair)를 map에 저장할 수 있다. map은 내부적으로 자료를 정렬하여 관리하므로 이 자료가 어느 위치에 저장될지는 알 수 없다.

왼쪽과 같이 익숙한 배열의 형태로도 데이터를 삽입할 수 있다. map[key] = value; 의 형태로 쓰면 map에 key,value 쌍의 데이터가 삽입되고, map[key]라고 쓰면 해당 map에서 key에 해당하는(key와 한 쌍인) value 값을 얻을 수 있다.

지울 때는 erase 함수를 쓰며, 반복자 또는 특정 key값을 통해 해당 key에 해당하는 value 한 쌍을 삭제할 수 있다. value 값으로는 삭제할 수 없다. map의 삽입, 삭제 및 참조의 모든 기준은 key이다.

다른 컨테이너와 거의 완전히 똑같은 방식으로 반복자를 이용해 컨테이너 내부의 모든 요소를 순회할 수 있다.

왜 이런 결과가 나올까?

내부 자료들을 정렬해서 저장한다는 map의 특성을 염두에 두고 코드를 분석해보자

Page 56: Stl vector, list, map

알고리즘

Page 57: Stl vector, list, map

알고리즘까지 다루려니 분량이 너무 많아져서 생략. 알고리즘은 다음 기회에...

Page 58: Stl vector, list, map

컨테이너와 반복자의 기본적인 개념 및 활용 방법을 알아보았다.

그러나 여기서 다룬 내용은 굉장히 기초적인 부분들이므로

더 자세하고 깊이 있는 내용은 뒤의 참고자료를 통해 알아보도록 하자.

마무리

Page 59: Stl vector, list, map

참고 자료 normative Reference

◆ soen.kr C++ STL 문법 관련 자료.

◆ http://goo.gl/nX1WS9 한빛 미디어의 STL e-book(무료).

그리고 기타 시중에 많이 나와 있는 좋은 STL 도서들...

Page 60: Stl vector, list, map

감사합니다