3. V
E
C
T
O
R
VECTOR의 장점
• 요소들의 크기가 같고, 인접한 위치에 이웃하여 배치되므로
메모리를 적게 차지하며 임의 위치를 빠른 속도로 액세스 할 수 있다.
• 최상위 레벨의 임의 접근 반복자를 제공하므로
STL의 모든 알고리즘을 사용할 수 있다.
4. V
E
C
T
O
R
VECTOR의 단점
• 삽입, 삭제 시 요소의 인접 배치 원칙을 지키기 위해
요소를 이동시켜야 하는 번거로움이 있어
삽입, 삭제 속도가 느리다.
• 삽입, 삭제가 빈번할 때는 벡터보다 리스트가 좋다.
5. 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의 삽입과 삭제
6. 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 보다 빠름)
7. L
I
S
T
LIST?
• Doubly Linked List
• 용도면에서는 vector와 동일, 인터페이스도 거의 유사
• 그러나 내부적으로는 vector와 판이하게 다른 구조
(vector는 요소를 직접 가리키는 포인터, list는 링크를 가리키는 포인터로 구성)
• vector와
8. L
I
S
T
LIST의 장점
• 위치와 요소 개수에 상관없이 삽입, 삭제가 가능해서
벡터보다 처리속도가 훨씬 빠르다.
• 삽입, 삭제되는 노드와 앞 뒤 노드의 링크만 바뀌므로
나머지 노드들에 영향을 주지 않는다. (반복자가 무효와 되지 않는다.)
• 처음부터 미리 크기를 결정할 필요가 없다.
9. L
I
S
T
LIST의 단점
• 반복자(iterator)가 +n 연산을 지원하지 않는다.
따라서 순서값([]연산자)으로 접근할 수 없다.
• 반드시 순회를 해야만 원하는 요소를 찾을 수 있다.
• 링크 구조로 인해 메모리 소모량이 vector보다 많다.
• 삽입, 삭제 시마다 노드를 할당, 해제하는 과정을 반복하므로
메모리 단편화가 심화된다.
10. 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의 삽입과 삭제
11. 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(); //리스트 연속된 중복 요소 제거
12. M
A
P
MAP?
• 키와 값을 쌍으로 관리하는 연관 컨테이너
cf) SET은 키의 집합만 관리
• 키를 정렬 및 검색의 기준으로 사용
• 키가 맵의 내부적인 구성이나 관리 방법에는 영향을 미치지 않는다.
13. MAP의 장점
• 검색 속도가 빠르다. 검색에는 최적의 컨테이너
cf) sparse matrix도 거대한 이차원 배열보다는 맵으로 표현하는 것이 정석이다.
M
A
P
14. MAP의 단점
• 키를 삽입할 때마다 정렬된 위치를 찾아서 삽입해야 하므로
대용량의 맵을 작성하는 데에는 시간이 많이 걸린다.
• 여러 값이 짝지어진 멀티 맵의 경우 확정적인 결과를 리턴할 수 없다.
• pair 클래스는 ==연산자를 제공하지 않기 때문에
pair 단위로 검색할 수 없다.
• 첫 번째 들어가는 Key는 한 번 삽입되면 무결성을 해치지 않기 위해
수정할 수 없다. 삭제하고 다시 삽입해야 한다.
M
A
P
15. #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
16. 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