2. 컨테이너(Container)
• 같은 타입을 저장, 관리할 목적으로 만들어진 클래스.
• STL은 C++의 template 문법을 이용해 임의 타입에 대해 동작할 수 있게 만들어져 있기
때문에 어떠한 객체라 해도 타입만 동일하다면 모두 한 컨테이너에 담을 수 있다.
• STL은 C++의 template 문법을 이용해 임의 타입에 대해 동작할 수 있게 만들어져 있기
때문에 어떠한 객체라 해도 타입만 동일하다면 모두 한 컨테이너에 담을 수 있다.
3. 컨테이너의 종류
• 표준 시퀀스(sequence) 컨테이너
• 컨테이너 원소가 자신만의 삽입 위치를 가짐.
• vector, deque(데크), list
• 표준 연관 컨테이너
• 저장 원소가 삽입 순서와 다르게 특정 정렬 기준에 의해 자동 정렬됨
• set, multiset, hash_set
• map, multimap, hash_map
• 어댑터 컨테이너(Adapter Container)
• 시퀀스 컨테이너를 적절히 변형하여 자료를 미리 정해진 일정한 방식에 따라 관리하는 컨
테이너다.
• 자료를 마음대로 넣고 뺄 수 없으며 컨테이너에서 정해놓은 방식대로만 조작할 수 있다.
• queue, stack, Priority queue
4. 반복자(Iterator)
• 모든 컨테이너들에서 원소를 순회하고 접근하기 위한 일반화된 방법을 제공.
• 모든 컨테이너는 begin(), end()함수를 제공하며, 각각 순차열의 시작과 끝을 가리키는 반
복자를 반환한다.
• 반복자는 포인터와 같은 인터페이스를 제공한다.
• 반복자가 가리키는 데이터: *iter
9. • size: 현재 실제로 vector에 저장되어 있는 요소가 몇 개인지 반환.
• capacity: capacity는 메모리가 얼마나 할당되어 있는지를 반환.
• empty: empty는 vector에 요소가 하나도 들어있지 않은 경우 true를, 그렇지 않은 경우 false를 리턴.
size가 0인지를 비교하는 것보다 empty를 사용하는 쪽이 더 성능이 좋기 때문에 vector가 비
어있는지 검사를 하고 싶을 때는 empty를 사용하는 쪽이 권장된다.
• clear: clear를 사용하면 vector에 존재하는 모든 요소를 삭제할 수 있다.
• insert: insert(iterator,value) 형식으로 사용하며, 해당 iterator 위치에 지정한 value를
• resize: vector의 크기를 지정한 개수로 강제로 바꿔버린다.
• reserve: 함수는 메모리를 미리 얼만큼 쓸 지 예약해 둔다.
vector는 기존 할당된 메모리 이상의 데이터가 들어오면 자동으로 추가 할당하는데,
이때 연속된 메모리를 할당하기 위해 기존의 모든 데이터를 새로운 주소로 복사하게 된다.
이 때문에 상당한 비효율이 발생하는데, reserve로 초기에 크게 할당을 해주면 이런 비효율을
막을 수 있다.
vector API
10. deque
c
front
back push_back(): 추가
pop_back(): 제거
push_back(): 추가
pop_back(): 제거
• vector와 달리 연속된 주소에 데이터를 저장하지 않기 때문에 추가 할당 시에 데이터를 복사하고 지우는 작업이 필요 없다.
• []연산자로 임의의 원소에 접근 가능.
• 앞에서도 추가와 제거가 가능하다.
• 따라서 앞뒤에서 추가 제거가 빈번하다면 deque를 쓰는 것이 더 빠르며, 그 외 연산은 vector가 더 빠르다.
• 그 외 사항은 vector와 같다.
11. list
• 링크드 리스트로 구현.
• Vector에 비해 임의의 위치에 데이터 삽입이 빠르다.
• 임의의 위치에 한번에 접근할 수 없다.
• at(), []의 사용이 불가능 하다.
• 임의접근 반복자가 아닌 양방향 반복자를 제공한다.(++,--연산만 가능. +,- 연산 불가)
• 따라서 임의의 위치에 대한 삽입 삭제가 빈번하면 list를 쓴다. 그 외 연산은 vector가 빠르다.
front backpush_back(): 추가
pop_back(): 제거
push_back(): 추가
pop_back(): 제거
insert(): 삽입
12. 2. 연관 컨테이너
• 삽입 순서에 따라 상대적인 위치를 갖는
컨테이너.
• set, hash_set
• map, hash_map
• 균형 이진 트리에 저장하며, 특정 정렬
기준에 따라 원소를 자동 정렬한다.
• 기본 정렬 기준은 less 조건자.
50
30 80
10 40 70 90
기본 정렬 기준: less
ex)
13. 연관 컨테이너
• 모든 연관 컨테이너는 같은 인터페이스(생성자, 멤버함수, 연산자)를 제공한다.
• push_back(), push_front(), pop_back(), pop_front(), front(), back()을 제공하지 않음.
• 이진 트리를 사용하여 시간복잡도가 로그 시간인 찾기 연산, 삽입 연산을 제공한다.
• 키와 값처럼 서로 연관성이 있는 데이터를 하나로 묶어 저장한다.
저장대상 키 키+값
중복 불허 set map
중복 가능 multi_set multi_map
14. set
• 키만을 저장하고, 중복된 값을 허용하지 않는다.
std::set<int> id; // or std::set<int, greater<int>> id;
id.insert(131021);
Id.insert(131021); // false 반
• 주로 특정한 집합을 관리하는 것에 이용된다.
• set 사용시 유리한 조건
• 자료를 정렬해서 저장해야 할 때
• Key값이 존재하는지 아닌지 알아야 할 때
• 많은 자료를 저장하고, 검색 속도가 빨라야 할 때
15. set API
• find(k) : k 원소의 위치를 가리키는 반복자 반환.
• insert(k) : k를 삽입. (삽입한 원소를 가리키는 반복자, 삽입 성공 여부) 의 pair 객체 반환.
• key_comp() : 정렬기준 조건자 반환 (less or greater)
• upper_bound(k): k보다 작지 않은 첫 원소의 반복자 반환.
• lower_bount(k): k보다 크지 않은 마지막 원소의 반복자 반환.
16. map
• 키와 값을 함께 pair로 저장한다.
std::map<int, std::string> name;
std::pair<int, std::string> student;
student.first = 131021;
student.second = "김태우";
name.insert(student);
• 키로 값을 찾을 수 있다. [] 사용 가능.
student.erase(131021); //지우기
student[131021] = “송원석”; //해당원소 값 변경
student.find(131021); // 원소 찾기 -> 반복자 반환.
Student[112452] == “김명찬”으로 썼을 때, Student[112452]가 없다면
빈 데이터를 만들기 때문에 반드시 find로 Student[112452]가 있는지 체
크하고 해야한다.
17. hash_set, hash_map
• 데이터를 트리가 아니라 해시에 저장하여 검색속도를 높인 것이다.
• Set, map과 인터페이스는 각각 같다.
• 정렬하여 저장할 필요는 없고 빠른 검색이 필요할 때 쓴다.
(단일 검색에 유용)
• 정렬된 저장이 필요하면 map, set을 쓴다.
(범위 검색에 유용)