본문 바로가기

공부기록/C, C++

[C++] map 출력하기

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에 데이터를 넣는 방법

  1. map의 insert 함수에 std::pair 객체를 넘기는 방법
  2. std::make_pair 함수로 std::pair 객체를 만들어 insert 함수에 넘기는 방법
  3. [] 연산자 이용해서 넣는 방법
#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;
    }
}

 

출력 결과