컨테이너 (시퀀스,연관,어댑터)

컨테이너의 종류에는 시퀀스, 연관, 어댑터가 존재한다.
이렇게 컨테이너가 종류별로 나뉜 이유는
삽입,삭제에 있어서 차이가 있기 때문이다.




시퀀스 컨테이너
=> 특별히 삽입과 삭제의 규칙이 존재하지 않는 컨테이너이다.
     push_back() pop_back() front_  insert() erase() 

*벡터*
 1. #include <vector> 를 추가해야함.
 2. 동적배열이다. ( 즉 연속된 메모리 공간 )
 3. 시퀀스 컨테이너.
 4. 삽입삭제가 느림.
 5. 임의접근 반복자를 사용.
 6. 임의요소 참조 빠름.
 7. 삽입삭제가 느림.
 8. 삽입, 삭제시 반복자 무효화 현상이 일어날 수 있으므로 각별히 주의!  
 9. 이론적으로 벡터에 포인터를 저장하는 것이 가능하기는 하지만 여러 가지로 신경써야 할 것들이 많고 불편하기 때문에 벡터에는 통상 값을 저장하는 것이 권장된다. 
 10. bool 타입의 벡터는 여러 활용이 있다. (일단 메모리가 아주 적기때문에 좋다)

*리스트*
 1. #include <list> 를 추가해야함.
 2. 더블 링크드리스트로 구현되있음.( 연속되지 않은 메모리 공간 )
 3. 삽입 삭제가 빠름.
 4. 임의요소 참조 느림.
 5. 더블 링크드리스트로 구현되있음.
 6. 양방향 참조 반복자를 이용함.
 7. 요소를 참조할때 반드시 반복자를 이용해야만 하고,  삽입, 삭제시 반복자 무효화 현상 리스트가 조금 적다.

*디큐*
 1. 양쪽으로 삽입할수 있는 컨테이너.
 2. 시퀀스 컨테이너.
 3. 양방향 참조 반복자를 이용함.



연관컨테이너
=> 1. 시퀀스 컨테이너와 차이점은 모든 원소들이 정렬 기준에 의존하여 정렬되어 들어간다.
     2. Multi와 그냥 이 있다.
     3. insert로 삽입하고, erase로 삭제, find로 검색

 *셋*
 1. #include <set> 을 추가하여야함 
 2. 원소를 하나를 가지는 연관컨테이너
 3. 셋은 키의 중복을 허용하지 않는다.
 4. 멀티셋은 키의 중복을 허용함.
 5. 양방향 반복자를 사용함

*맵*
 1. #include <map> 을 추가하여야함
 2. 원소를 2개를 가진다. (Key 와 value)
 3. 그렇기 때문에 utility 의 std::pair 구조체를 사용한다 (first, second)
 4. 맵은 키의 중복을 허용하지 않는다.
 5. 멀티맵은 키의 중복도 허용.
 6. 양반향 반복자를 사용함
 7. [] 연산자가 오버로딩되있어 []이것으로 키의 값을 넣을수 있다. ex) MArray[3] = "헐" 
 8. [] 연산자는 보통의 포인터 연산이 아닌 양방향으로 순회하여 찾는식으로 지정이 되어있다(로직이 다르다)
 9. [] 는 멀티맵에는 지정되어있지 않다.



어댑터 컨테이너
=>
기존 컨테이너의 기능 중 일부만을 공개하여 기능이 제한되거나 변형된 컨테이너를 말한다.
큐,스택,우선순위큐



컨테이너들이 반드시 갖추어야할 사항들
1. 원소들은 복사 생성자에 의해서 복사되어 질 수 있어야 한다.
2. 원소들은 할당 연산자들에 의해서 항당되어 질 수 있어야만 한다.
3. 모든 원소들은 소멸자에 의해서 파괴될 수 있어야 한다.
=>이래서 모든 클래스의 디폴트로 지정이 되어있는것이다.

시퀀스 컨테이너의 멤버함수들을 위해 디폴트 생성자는 반드시 존재해야함.( 배열을 떠올려 보아라 )
동일함을 검사하기 위한 == 연산자는 반드시 정의 되어있어야함.
연관 컨테이너에 대해서는 정렬의 기준이 반드시 제공되어야만 함.



컨테이너의 공통적인 특징 및 동작

1. 모든 컨테이너는 "레퍼런스 의미론"보다는 "값 의미론"을 제공한다.
즉, 컨테이너에 삽입이 이루어질 경우 내부적으로 복사본을 생성한다. 그러므로 모든 STL 컨테이너의 원소들은 복사되어 질 수 있어야 한다.

2. 일반적으로 모든 원소들은 순서를 가지고 있다.
그러므로 모든 원소들을 여러번 순회하더라도 같은 순서로 순회할 수 있다. 각각의 컨테이너는 자신의 원소를 순회할 수 있다록 자신만의 반복자를 제공함. (이것이 STL 핵심아니겟냥 ㅋㅋ)

3.대부분의 경우, STL자체는 예외를 발생 시키지 않는다.
따라서 동작에 대한 인자(parameter)를 제공하는 것을 보장해 주어야 한다.



컨테이너의 공통적인 동작
=>모든 클래스에 정의되있는 정의와 함수에 대해 알아보자 
1. 초기화 관련 
=> 디폴트 생성자, 다른컨테이너의 주어진 범위원소들로 컨테이너 초기화 

2. 사이즈와 관련된 동작
=>
컨테이너.size()
컨테이너.empty()
컨테이너.max_size()

3. 비교와 관련된 동작
=>==, !=, <, >, <=, >=, =

4. 할당과 swap() 







이 글을 공유하기

댓글

Designed by JB FACTORY