STL 개요
STL 프로그램에 필요한 자료구조와 알고리즘을 Template으로 제공하는 라이브러리
std namespace에 정의되어 있기 때문에 std:: 와 함께 써야한다.
Container : 임의 타입의 객체를 보관할 수 있다.
- Sequence Container
> vector, list, deque - Associative Container
> set, multiset, map, multimap
Iterator : 컨테이너 원소에 대한 포인터로, 원소들에 하나씩 접근할 수 있다.
- iterator
- const_iterator
- reverse_iterator 등
Algorithm : 반복자들을 가지고 일련의 작업을 수행한다.
map
- key - value 구조를 가진다.
- key는 중복될 수 없다.
- insert로 중복된 key값을 넣으면 무시되고
- [] 로 중복된 key값을 넣으면 값이 대체된다.
- 데이터가 자동으로 정렬되어 저장된다. (default는 오름차순)
[map에 데이터 넣기]
맵에 원소를 넣기 위해서는 반드시 std::pair 객체를 전달해야 한다.
std::pair
template <class T1, class T2>
struct std::pair {
T1 first;
T2 second;
};
|
map에 데이터를 넣는 방법
- map의 insert 함수에 std::pair 객체를 넘기는 방법
- std::make_pair 함수로 std::pair 객체를 만들어 insert 함수에 넘기는 방법
- [] 연산자 이용해서 넣는 방법
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<std::string, double> student_score;
// 맵의 insert 함수는 pair 객체를 인자로 받습니다.
student_score.insert(std::pair<std::string, double>("AMY", 2.23));
student_score.insert(std::pair<std::string, double>("BOB", 2.93));
// std::make_pair 함수 활용
student_score.insert(std::make_pair("TONY", 3.04));
student_score.insert(std::make_pair("STEVE", 3.05));
// [] 연산자 사용
student_score["LEE"] = 3.56;
student_score["KIM"] = 3.76;
print_map(student_score);
return 0;
}
[map 출력하기]
iterator는 container에 typedef 키워드를 이용해 멤버 타입으로 정의되어 있다.
iterator를 활용해 for문으로 map 내부 객체에 접근할 수 있다.
아래에서 선언한 itr는 pair 객체를 가리키게 되므로, itr->first로 key에, itr->second로 value에 접근하면 된다.
#include <iostream>
#include <map>
void print_map(std::map<std::string, double>& m) {
for (std::map<std::string, double>::iterator itr = m.begin(); itr != m.end(); ++itr) {
std::cout << itr->first << " " << itr->second << std::endl;
}
}
함수 template을 이용한 general한 버전
// 함수 template을 이용한 general한 버전
template <typename K, typename V>
void print_map(std::map<K, V>& m) {
for (typename std::map<K, V>::iterator itr = m.begin(); itr != m.end(); ++itr)
{
std::cout << itr->first << " " << itr->second << std::endl;
}
}
출력 결과
'공부기록 > C, C++' 카테고리의 다른 글
[C++] typedef 와 typename 그리고 중첩의존타입이름 (0) | 2021.04.18 |
---|---|
[BOJ] 기타 입출력 문제 C++ (0) | 2020.10.24 |
[BOJ] 입출력 A+B 문제 C++ (0) | 2020.10.18 |
[C++] 포인터 대신 참조자(reference)를 써야하는 경우는 ? (0) | 2020.07.11 |
[C] 이중포인터의 선언, 할당, 참조 이해하기 (0) | 2020.06.12 |