Abseil Tip 158 Abseil 연관 컨테이너와 contains()

주간 팁 #158: Abseil 연관 컨테이너와 contains()

원래 게시일: 2019년 1월 3일
작성자: James Dennett
최종 업데이트: 2020년 4월 20일

바로가기: abseil.io/tips/158


이 컨테이너에 이 값이 포함되어 있나요?

C++에서 집합(set)에 특정 값이 포함되어 있는지, 맵(map)에 특정 키가 포함되어 있는지 확인하려면 전통적으로 다음과 같은 다소 장황한 코드를 작성해야 했습니다.

container.find(value) != container.end()

혹은, 다소 난해하고 때로는 비효율적인 코드도 사용됩니다.

container.count(value) != 0

그러나 우리가 원하는 것은 단순하게 다음과 같은 형태입니다.

container.contains(value)

container.contains(value)로 해결!

더 간단한 이 문법은 C++20 표준에 포함되었으며, Abseil의 해시 컨테이너(absl::{flat,node}_hash_{map,set})와 btree 컨테이너(absl::btree_*)에서도 지원됩니다.

contains이질적인 조회에 대해 find와 동일한 기능을 제공합니다. 예를 들어, absl::flat_hash_set<std::string>이 특정 absl::string_view 값을 포함하는지 확인할 때, std::string 객체로 변환하는 비용을 들이지 않고도 체크할 수 있습니다.

constexpr absl::string_view name = "Willard Van Orman Quine";
absl::flat_hash_set<std::string> names = {std::string(name)};
assert(names.contains(name));  // 동적 할당이 없습니다.

연관 컨테이너가 필요한 대부분의 코드는 Abseil의 해시 컨테이너를 사용해야 합니다(참고: 팁 #136). 따라서 새 코드에서 다른 방식을 사용하는 일은 드물어야 합니다.

주의: 팁 #132 (“중복 맵 조회를 피하라”)에서 설명했듯이, 컨테이너에 항목이 포함되어 있는지 확인한 다음 또 다른 조회 작업(find, insert, remove 등)을 수행하는 것은 피해야 합니다.


결론

연관 컨테이너에서 항목이 포함되어 있는지 확인하는 작업은 흔히 발생합니다. 이를 위한 자연스러운 문법은 container.contains(value)입니다. 가능한 경우 이 문법을 사용하는 것을 권장합니다.