map은 템플릿 클래스이기 때문에 선언할 때 <> 사이에 key 값의 타입, value 값의 타입을 순서대로 적어줘야 한다.
key 타입과 value 타입이 같지 않아도 된다.
map<int, string> m;
이렇게 타입이 달라도 상관없다.
이렇게 선언된 map에 데이터를 저장하고 싶다면
m[1] = "one";
이렇게 하면 된다.
크기가 확보된 것도 아닌데 빈 map 객체인데도 이렇게 인덱스로 저장이 가능하다.
벡터의 경우에 데이터를 추가하고 싶다면 push_back() 함수를 써야 하고 set의 경우에는 insert() 함수를 써서 데이터를 추가할 수 있었는데 map은 원래 1이라는 인덱스가 있는 것처럼 저렇게 key 값을 [ ] 사이에 적고 그 키 값에 해당하는 value 값을 대입해주면 된다.
다만 주의할 것은 map이라는 자료구조는 key를 통해서 원하는 값을 꺼내오는 것이기 때문에 key 값은 유일한 값이어야 한다. 즉 key 값들 끼리는 중복이 없어야 한다. 다음 코드를 보자.
함수들의 사용법은 매우 간단하기 때문에 이 예제 코드와 실행 결과만 봐도 알 수 있을 것이라 생각된다.
그럼 이제 map에 저장된 모든 데이터 쌍을 순회하는 법을 알아보자.
배열이나 벡터 같은 경우는 for(int i = 0; i < n; i++) 이 문장으로 모든 것이 가능했다. 이렇게 하고 for문 안에서 i를 인덱스로 해서 그 인덱스에 해당하는 원소에 접근할 수 있었다. 하지만 map은 인덱스로 접근이 불가능하고 key 값으로 접근이 가능한 자료구조이기 때문에 순회를 하려면 iterator를 사용해야 한다.
#include <iostream>
#include <string>
#include <map>
#include <tuple>
using namespace std;
int main() {
map<string, int> m;
m["김철수"] = 15;
m["김영희"] = 23;
m["홍길동"] = 40;
for (map<string, int>::iterator iter = m.begin(); iter != m.end(); iter++) {
cout << "이름: " << iter->first << ", 나이: " << iter->second << endl;
}
return 0;
}
for(int i = 0; i < n; i++) 대신에 for(map<string, int>::iterator iter = m.begin(); iter != m.end(); iter++)를 쓰는데
for(map<string, int>::iterator iter = m.begin(); iter != m.end(); iter++)
이 코드 꼭 알아두자.
iterator는 주소이기 때문에 iter.first가 아니라 iter->first 또는 (*iter).first로 접근이 가능하다.
예를 들어 하나의 원소가 8바이트인 map 객체가 있는데 3개의 쌍이 들어있고 map의 시작 주소는 1000이라고 하자.
그러면 첫 번째 원소는 1000번지~1007번지 이렇게 8바이트에 걸쳐서 저장되어 있다.
두 번째 원소는 1008번지~1015번지에, 세 번째 원소 즉 마지막 원소는 1016번지~1023번지에 저장되어 있을 것이다.
iterator 변수인 iter를 iter++를 하면 iter가 가지고 있는 주소는 8바이트씩 증가한다.
즉 처음에 iter=m.begin() 이렇게 선언되었을 때 iter는 1000, for문을 한 번 돌고 나면 iter++에 의해 1008이 되고, 그 다음 for문을 돌면서 1016이 된다. 그리고 iter++에 의해서 1024가 된다. 이 1024가 바로 m.end()이다.
그렇게 for문을 돌면서 순회하다가 for문에서 조건 체크를 한다. iter != m.end()이어야 for문의 body 부분으로 들어갈 수 있는데 1024는 m.end()이다. 따라서 for문을 빠져나가게 되는 것이다.
#include <iostream>
#include <tuple>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int arr[100];
int m, n;
cin >> m >> n;
for (int i = 0; i < 100; i++) {
arr[i] = (i + 1) * (i + 1);
}
int count = 0;
long long sum = 0;
int minNum;
for (int i = 0; i < 100; i++) {
if (arr[i] >= m && arr[i] <= n) {
count++;
sum += arr[i];
if (count == 1) {
minNum = arr[i];
}
}
}
if (count == 0) cout << -1;
else {
cout << sum << endl;
cout << minNum;
}
return 0;
}