Skip to content

2014 07 08 map의 insert 메서드와 [] 연산자

krikit edited this page Nov 26, 2014 · 1 revision

map의 insert 메서드

map의 [] 연산자를 통해 키와 값을 삽입하려 하면 기존에 키가 존재할 경우 업데이트를 하고, 존재하지 않으면 새로 추가하게 됩니다. 그러나 실제로 업데이트가 일어났는지 삽입이 일어났는 지 알 수가 없어 키의 중복 여부를 알아내기 위해서는 먼저 키로 찾아보고 판단해야 합니다.

std::map<std::string, int> str_int_map;
auto iter = str_int_map.find("one");
if (iter == str_int_map.end()) {
  // 키가 발견되지 않음
} else {
  // 키가 이미 존재함
}

그러나 insert 메서드를 사용하면 [] 연산자와는 반대로 키가 존재할 경우 업데이트를 하지 않고 삽입 여부를 리턴합니다.

auto ret = str_int_map.insert({"one", 1});
if (ret.second) {
  // 삽입 성공: 키가 발견되지 않음
} else {
  // 삽입 실패: 키가 이미 존재함
}

map의 [] 연산자

map의 [] 연산자로 접근할 때에는 항목이 존재하지 않을 경우 새로운 값 객체가 생성되기 때문에 값이 객체 타입일 경우 디폴트 생성자를 가지고 있어야 합니다. 그리고 이로 인해 [] 연산자는 const로 선언되지 않아서 거기에 따른 제약이 있습니다.

int foo(const std::map<int, int>& int_int_map) {
  return int_int_map[1];    // 컴파일 오류
}

int foo(const std::map<int, int>& int_int_map) {
  auto iter = int_int_map.find(1);
  if (iter != int_int_map.end()) return iter->second;
}
Clone this wiki locally