본문 바로가기
카테고리 없음

[C++] - STL ( deque , map )

by MY블로그 2023. 1. 16.
이번에는 STL 중에서 deque 그리고 map 에 관하여 정리 및 조사를 하게 되었다.

예전에 STL 기초에 대하여 배우면서 먼저 vector 에 대하여 조사한적도 있었는데.

그때 잠깐 보았던 deque 를 다시 보게 되었다.

● deque 란?

deque container 라고하며 시퀸스 컨테이너, 배열 기반 컨테이너 이다.

vector와 유사한 특징을 가지고 있으나 하나의 메모리 블록에 저장되는 vector와 다르게

deque는 여러개의 메모리 블록에 나뉘어 저장된다는 특징이 있다.

https://novlog.tistory.com/23

예전 vector 와 관련하여 위의 이미지를 보도록 한다.

예전 vector에서는 새로운 배열을 뒤쪽에서만 붙이거나 떼는 것이 권장되어있었다.

(왜냐하면 벡터의경우 연속된 배열의 형태이기때문에 앞의 배열이없어지면 그뒤에배열들이 한칸씩 다당겨져야하거나

삽입시 한칸씩 뒤로밀려나는 경우로 인하여 효율적이지 못하기 때문이었다!)

하지만 deque의 경우 이미지와같이 배열의 앞에 새로운 배열을 붙이거나 뗄 수가 있다!

(이점을 사용한다면 deque는 vector보다 유용하게 사용이 가능 할 것이다.)

또다른 차이점을본다면

단순히 뒤쪽에 새로운 배열을 붙이는 작업을 한다는 가정하에

vector는 메모리가 가득 차있을 경우 메모리를복사한후 이전공간을삭제 -> 더넓은 공간으로 붙여넣기를 하는

방식으로 이루어졌으나 deque는 복사 삭제의 과정없이 새로운 공간을 단순히 할당해 준다는 것이다.

https://novlog.tistory.com/23

● deque 사용법!

deque를 사용하려면 필요한 헤더파일이 추가 되어야 한다.

#include<deque>

위처럼 오랜만에 보는것같은 #include를 이용하여아한다.

다음으로 기본적인 선언 및 생성차를 이용하여 초기화를 한다.

deque<ObRect*>	trail;

수업에서 나왔던 코드를 참고한다.  위처럼 선언한다! 기본형태는  deque<자료형 타입>이름;

https://novlog.tistory.com/23

● deque 값 추가 & 삭제

https://novlog.tistory.com/23
https://novlog.tistory.com/23
https://novlog.tistory.com/23
https://novlog.tistory.com/23
https://novlog.tistory.com/23
https://novlog.tistory.com/23

마지막예시에서 [] 배열원소에접근하는방식은 범위를 벗어난 곳을 지정하면 쓰레기값을 출력하지만

(at)의경우 범위를 벗어난 곳이라면 터미널에러 메시지를 발생시킨다고한다! (이미지 참조사이트참고!)



이번에는 한번도 안봤었던.. STL 할때 살짝보긴했지만.

잘모르는 map 에 관한 조사이다.

● map 이란?
  • map container 라고 하며 연관 컨테이너 중의 하나이다.
  • 노드 기반으로 이루어져 있으며 균형 이진 트리 구조 이다.

(노드란? 컴퓨터 메모리 곳곳에 흩어져 있는 데이터 조각 이라고 한다.)

(균형 이진 트리 구조? 모든 노드의 좌특과 우측 서브 트리의 높이가 1이상 차이가 나지 않는 트리)

와.. 뭐라는건지 아직은 잘모르지만 하나씩 알아본다..

  • Map - key(키) & value(값) 의 pair(쌍)으로 이루어진 객체 형태로 저장이 된다.
  • Unique Key - 고우한 값을가지며 중복이 불가능 하다.(중복 key 는 multimap 에서가능)
  • Ordered - 삽입이 되면서 자동으로 정렬이 이루어 진다.(기본값은 less/오름차순
  • Allocator-aware - 저장공간의 필요에 따라 allocator 객체를 사용한다(동적할당)
● map 의 사용법
#include<map>

위처럼 헤더파일에 포함 시키며 기본 생성 방법은 map<[Data type1],[Data type2]>[변수이름];

map<int,int>m1;
map<string,int>m2;
ex) m1.insert(pair<int, int>(10, 20));
ex) m2.insert(pair<string, int>("BlockDMask", 27));

위처럼 key 값 + value 값 의 쌍을 이룰 수 있도록 두개의 데이터 타입으로 구성된다.

 

● map 의 생성자와 연산자

map<int, int> m; - 기본 선언 방법
map<int> m(pred); - pred를 통해 정렬기준(오름,내림)을 세웁니다.
map<int> m2(m1); - m1을 복사한 m2 를 생성한다.
연산자 ("==", "!=", "<", ">", "<=", ">=") 사용가능하다.
연산자 m[key] = val; 을 통해서 원소( key, value ) 를 추가 또는 수정이 가능하다. (operator [ ] )

 

● map 의 멤버 함수

- m.begin();  - 시작 원소를 가리킨다.
- m.end(); - 마지막 원소를 가리킨다.
- m.rbegin(); - begin 과 반대로 작동하는 멤버함수이다.
- m.rend(); - end 와 반대로 작동하는 멤버함수이다.
- m.clear(); - 모든 원소를 제거 한다.
- m.count(k); - 원소 k 의 갯수를 반환한다.
- m.empty(); - 비어있는지 확인하는 멤버함수.
- m.insert(k); - 원소 k를 삽입한다. (k는 pair 객체).
- m.insert(iter, k); - iter가 가리키는 위치에 k를 삽입
- m.erase(start, end); - start ~ end 까지 원소를 모두 제거
- m.find(k); - k 원소를 가리키는 반복자를 반환(없다면 m.end()반환)
- m2.swap(m1); - m1과 m2를 교환해 준다.
- m.upper_bound(k); - k원소가 끝나는 구간의 반복자.
- m.lower_bound(k); - k원소가 시작하는 구간의 반복자.
- m.equal_range(k); - k원소가 시작하는 구간과 끝나는 구간의 반복자 ( pair 객체를 반환 )
- m.value_comp(); & m.key_comp(); - 정렬 기준 조건자를 반환.
- m.size(); - 크기(원소의 갯수)를 반환
- m.max_size(); - 최대 크기(남은 메모리의 크기)를 반환

 

● map 의 예제

https://blockdmask.tistory.com/87
https://blockdmask.tistory.com/87

~ 참 조 사 이 트 ~

 

https://novlog.tistory.com/23

 

[C++ STL] Deque Container 사용 방법 & 관련 예제 총 정리

#1 About Deque #2 Deque 사용방법 -2.1 deque 선언 & 초기화 -2.2 deque 값 삽입/삭제 - push_back() pop_back() push_front() pop_front() -2.3 deque 값 중간 삽입/삭제 - insert() erase() -2.4 첫 번째 원소 / 마지막 원소 접근 - fron

novlog.tistory.com

 

https://blockdmask.tistory.com/87

 

[C++] map container 정리 및 사용법

안녕하세요. BlockDMask 입니다. 오늘은 연관 컨테이너 set, multiset, map, multimap 중. key와 value가 쌍으로 저장되는 map에 대해서 알아보도록 하겠습니다. std::map은 std::vector 처럼 정말 많이 쓰이는 컨테이

blockdmask.tistory.com

 

댓글