728x90
Map
- key와 value로 이루어져 있으며 pair 형태로 저장됨
- 배열 형태로 표현이 가능하지만 index는 맵의 key값을 사용한다.
- set과 마찬가지로 삽입이 되면서 자동으로 정렬 됨.
- key는 고유 값이므로 중복이 불가능. (중복 key는 multimap에서 가능)
선언 > map<data type1, data type2> 변수명;
map <int, int> d1;
map <int, int> d2 = {{1,2}, {3,4}, {5,6}};
map <string, int> d3;
[ ] 사이의 값은 map의 key값을 사용한다.
map<string,int> m;
m["one"] = 10;
m["two"] = 20;
m["three"] = 30;
cout << m["one"] << endl; // result : 10
cout << m["two"] << endl; // result : 20
cout << m["three"] << endl; // result : 30
Map의 멤버 함수
- set 함수와 동일
- map.insert(make_pair(key,value)) : 맵에 원소를 pair 형태로 추가
- map.erase(key) : 맵에서 key 값에 해당하는 원소 삭제
- map.size() : 원소(pair)의 갯수를 반환
- map.count(key) : key 값에 해당하는 원소(value)의 개수를 반환
- map.find(key) : key 값에 해당하는 interator를 반환
map<int, int> d1;
map<int, int> d2;
for(int i = 1; i <= 9; i+= 2) {
d1[i] = i*i;
d2[i] = i*i;
}
cout << "d1.size() = " << d1.size() << '\n'; // d1.size() = 5
cout << "d2.size() = " << d2.size() << '\n'; // d2.size() = 5
for(int i = 1; i <= 10; i++) {
if(d1[i]) cout << i << ','; // 1,3,5,7,9,
}
cout << '\n';
for (int i = 1; i <=10; i++) {
if(d2.count(i)) cout << i << ','; // 1,3,5,7,9,
}
cout << '\n';
cout << "d1.size() = " << d1.size() << '\n'; // d1.size() = 10
cout << "d2.size() = " << d2.size() << '\n'; // d2.size() = 5
# [] 연산자는 map에 없는 key를 참조하면 자동으로 값의 default 생성자를 호출해서 원소를 추가해줌.
Map의 순회
map<int, int> m1 = {{1,2}, {3,4}, {5,6}};
// using iterator
for (auto it = m1.begin(); it != m1.end(); i++) {
cout << "m1[" << it-> first << "] = " << it-> second << '\n';
}
// range-based for
for(auto p : m1) {
cout << "m1[" << p.first << "] = " << p.second << '\n';
}
// for loop
for(int i = 0; i < 6; i++) {
if(m1.count(i))
cout << "m1[" << i << "] = " << m1[i] << '\n';
}
- 반복문을 통해 map container에 접근하는 방법. 컴파일 결과는 모두 동일하다.
compile result )
m1[1] = 2
m1[3] = 4
m1[5] = 6
Set
- 연관 컨테이너 중 하나.
- 노드 기반 컨테이너 이며 균형 이진트리로 구현되어 있음.
- key 라고 불리는 원소들의 집합으로 이루어진 컨테이너.
- 추가되는 데이터는 기본적으로 '오름차순'으로 자동 정렬해서 관리.
- 중복되는 데이터는 자동으로 배제시킨다.
- - iterator 연산은 list::iterator 연산과 동일함. (증감 연산자)
선언) set<data type> 변수 이름;
set<int> s1;
set<int> s2(pred); //pred 통해 정렬기준을 세움
set<int> s3 = {1, 5, 2, 4, 3}
set<int> s4 = {1, 2, 2, 2, 1, 1, 1, 3, 3, 3, 4, 1, 2, 3, 4};
cout << "s1 size: " << s1.size() << '\n'; // s1 size: 0
cout << "s3 size: " << s3.size() << '\n'; // s3 size: 5
cout << "s4 size: " << s4.size() << '\n'; // s4 size: 4
for(int x : s1) cout << x << ','; //
for(int x : s3) cout << x << ','; // 1,2,3,4,5, 자동으로 오름차순
for(int x : s4) cout << x << ','; // 1,2,3,4, 중복 데이터 제거, 오름차순 정렬
Set의 멤버 함수
- set.insert(n) : n을 삽입. return type은 pair<iterator, bool>
set<int> s;
s.insert(1); s.insert(3); s.insert(2);
cout << "s.size() = " << s.size() << '\n'; // s.size() = 3
pair<set<int>::iterator, bool> result = s.insert(4);
cout << "result iterator = " << *result.fisrt << '\n'; // result iterator = 4 추가된 데이터의 iterator 위치
cout << "result bool = " << result.second << '\n'; // result bool = 1 새로운 데이터가 추가됨
auto result2 = s.insert(3);
cout << "result2 iterator = " << *result2.first << '\n'; // result2 iterator = 3 원래 있는 데이터의 iterator 위치
cout << "result2 bool = " << result2.second << '\n'; // result2 bool = 0 새로운 데이터가 추가되지 않음
- set.find(n) : find 데이터가 있으면 해당 데이터(n)의 iterator를 반환, 없으면 end() 지점을 반환함.
'C++' 카테고리의 다른 글
[C++] Sequence Container (Vector, Deque, List, Queue, Stack) (0) | 2023.03.12 |
---|---|
[C++] <algorithm> 라이브러리 속 유용한 함수 (0) | 2021.12.15 |
[C++] Lamda Function와 Function variable (0) | 2021.12.15 |
[C++] Auto, Pair, Tuple 자료형과 Range-based for (0) | 2021.12.14 |