C++ VECTOR, LIST, MAP

16

Click here to load reader

description

C++ vector, list, map에 대한 내용을 정리해봤습니다.

Transcript of C++ VECTOR, LIST, MAP

Page 1: C++ VECTOR, LIST, MAP

VECTOR

LIST

MAP 141055 우재우

PL in C++

Page 2: C++ VECTOR, LIST, MAP

V E C T O R

VECTOR?

• 임의 타입의 동적 배열

• 동일 타입 자료 집합인 템플릿 기반의 시퀀스 컨테이너

• 요소의 개수에 따라 자동으로 메모리 관리

• 자료 관리에 탁월한 성능

Page 3: C++ VECTOR, LIST, MAP

V E C T O R

VECTOR의 장점

• 요소들의 크기가 같고, 인접한 위치에 이웃하여 배치되므로

메모리를 적게 차지하며 임의 위치를 빠른 속도로 액세스 할 수 있다.

• 최상위 레벨의 임의 접근 반복자를 제공하므로

STL의 모든 알고리즘을 사용할 수 있다.

Page 4: C++ VECTOR, LIST, MAP

V E C T O R

VECTOR의 단점

• 삽입, 삭제 시 요소의 인접 배치 원칙을 지키기 위해

요소를 이동시켜야 하는 번거로움이 있어

삽입, 삭제 속도가 느리다.

• 삽입, 삭제가 빈번할 때는 벡터보다 리스트가 좋다.

Page 5: C++ VECTOR, LIST, MAP

V E C T O R

#include <vector>

vector<Type> v1; //벡터 v1 생성

v1.push_back(a); //a라는 원소를 벡터 끝에 추가

v1.pop_back(); //벡터 끝 요소를 삭제

vi.insert(vi.begin()+3, b); //시작으로부터 세 번째에 b 삽입

vi.insert(vi.begin(), 10, c); //c를 10개 일괄 삽입

vi.erase(vi.begin()+3); //시작으로부터 세 번째 요소 삭제

vi.erase(vi.begin()+5, vi.begin()+8); //5~8 번째 요소들 삭제

VECTOR의 삽입과 삭제

Page 6: C++ VECTOR, LIST, MAP

V E C T O R

VECTOR 함수

#include <vector>

vector<Type> v2; //벡터 v2 생성

v2.size(); //벡터 v2 크기 반환

v2.max_size(); //벡터가 관리할 수 있는 최대 요소 개소를 조사

v2.capacity(); //할당된 요소 개수를 조사

v2.resize(n); //벡터의 크기를 n으로 변경

v2.reserve(n); //미리 필요한 메모리를 할당해 놓는 함수 (자동할당보다 빠름)

v2.clear(); //벡터 내 모든 요소 삭제

v2.empty(); //벡터가 비어 있는지 점검 (v2.size()==0 보다 빠름)

Page 7: C++ VECTOR, LIST, MAP

L I S T

LIST?

• Doubly Linked List

• 용도면에서는 vector와 동일, 인터페이스도 거의 유사

• 그러나 내부적으로는 vector와 판이하게 다른 구조

(vector는 요소를 직접 가리키는 포인터, list는 링크를 가리키는 포인터로 구성)

• vector와

Page 8: C++ VECTOR, LIST, MAP

L I S T

LIST의 장점

• 위치와 요소 개수에 상관없이 삽입, 삭제가 가능해서

벡터보다 처리속도가 훨씬 빠르다.

• 삽입, 삭제되는 노드와 앞 뒤 노드의 링크만 바뀌므로

나머지 노드들에 영향을 주지 않는다. (반복자가 무효와 되지 않는다.)

• 처음부터 미리 크기를 결정할 필요가 없다.

Page 9: C++ VECTOR, LIST, MAP

L I S T

LIST의 단점

• 반복자(iterator)가 +n 연산을 지원하지 않는다.

따라서 순서값([]연산자)으로 접근할 수 없다.

• 반드시 순회를 해야만 원하는 요소를 찾을 수 있다.

• 링크 구조로 인해 메모리 소모량이 vector보다 많다.

• 삽입, 삭제 시마다 노드를 할당, 해제하는 과정을 반복하므로

메모리 단편화가 심화된다.

Page 10: C++ VECTOR, LIST, MAP

L I S T

#include <list>

list<Type> l1; //리스트 l1 생성

l1.push_front(a); //a라는 요소를 리스트 처음에 추가

l1.push_back(b); //b라는 요소를 리스트 처음에 추가

l1.insert(iterator, c); //iterator 앞에 c 삽입

l1.erase(iterator); //iterator 노드 삭제

※ iterator는 it = li.begin(), li.end()를 기준으로 it++, it--로 이동

l1.remove(d); //값을 검색해 list 내 모든 d를 찾아서 삭제

LIST의 삽입과 삭제

Page 11: C++ VECTOR, LIST, MAP

L I S T

LIST 함수

#include <list>

list<Type> l2; //리스트 l2 생성

l2.swap(l3); //l2와 l3 교환

l2.reverse(); //리스트 순서 역순으로 바꾸기

l2.merge(l3); //l2와 l3 병합

l2.splice(iterator, l4); //리스트 l4의 내용을 iterator 위치로 이동

l2.sort(); //리스트 내용을 퀵소트

l2.unique(); //리스트 연속된 중복 요소 제거

Page 12: C++ VECTOR, LIST, MAP

M A P

MAP?

• 키와 값을 쌍으로 관리하는 연관 컨테이너

cf) SET은 키의 집합만 관리

• 키를 정렬 및 검색의 기준으로 사용

• 키가 맵의 내부적인 구성이나 관리 방법에는 영향을 미치지 않는다.

Page 13: C++ VECTOR, LIST, MAP

MAP의 장점

• 검색 속도가 빠르다. 검색에는 최적의 컨테이너

cf) sparse matrix도 거대한 이차원 배열보다는 맵으로 표현하는 것이 정석이다. M A P

Page 14: C++ VECTOR, LIST, MAP

MAP의 단점

• 키를 삽입할 때마다 정렬된 위치를 찾아서 삽입해야 하므로

대용량의 맵을 작성하는 데에는 시간이 많이 걸린다.

• 여러 값이 짝지어진 멀티 맵의 경우 확정적인 결과를 리턴할 수 없다.

• pair 클래스는 ==연산자를 제공하지 않기 때문에

pair 단위로 검색할 수 없다.

• 첫 번째 들어가는 Key는 한 번 삽입되면 무결성을 해치지 않기 위해

수정할 수 없다. 삭제하고 다시 삽입해야 한다.

M A P

Page 15: C++ VECTOR, LIST, MAP

#include <map>

map<Type1, Type2> m1; //맵 m1 생성

m1.insert(pair<Type1, Type2>(a, b)); //a를 키로 b를 값으로 삽입

m1[c] = d; //c를 키로 d를 값으로 삽입

m1.erase(m1.begin()); //첫 번째 쌍 삭제

m1.erase(a); //first 키를 직접 입력하여 삭제

MAP의 삽입과 삭제

M A P

Page 16: C++ VECTOR, LIST, MAP

MAP 함수

#include <map>

map<Type> m2; //맵 m2 생성

it = m2.find(a); //키 값 a로 iterator 검색(반환)

cf) it->first는 첫 번째 타입의 값, it->second는 두 번째 타입의 값

m2.size(); //m2의 크기를 반환

m2.max_size(); //m2가 가지는 최대 크기를 반환

m2.swap(m3); //m2와 m3의 내용을 교체

m2.clear(); //m2 내용 전체 삭제

m2.empty(); //m2가 비었는지 확인

m2.lower_bound(b); //키 값 b보다 낮은 쌍의 iterator 반환

m2.upper_bound(c); //키 값 c보다 높은 쌍의 iterator 반환

m2.equal_range(d); //m2.first = m2.lower_bound(d)

m2.second = m2.upper_bound(d)

M A P