每周小贴士#158:Abseil关联窗口和contains()

Posted -飞鹤-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每周小贴士#158:Abseil关联窗口和contains()相关的知识,希望对你有一定的参考价值。

作为TotW#158最初发表于2019年1月3日

由James Dennett创作

"我不能包含我自己“——伯特兰·罗素

这个容器是否包含这个元素?

当检查一个集合是否包含一个值或者一个映射是否包含一个键时,历史上C++强制用户在写下繁琐冗长的

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

或者是有争议(有时效率低下)的

container.count(value) != 0

而不是我们所期望的

container.contains(value)

container.contains(value)来拯救

更简洁的语法是C++20标准的一部分,Abseil的(absl::flat,nodehashmap,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));  // 这里没有动态分配内存。

鉴于我们大部分需要使用关联容器(无论是set还是map)的代码今天都应该使用Abseil的哈希容器(参见小贴士#136),因此在新代码中很少需要使用其他形式之一。

注意:如小贴士#132(“避免冗余的Map查找”)中所述,不要检查一个项是否在容器中,然后执行另一个隐式查找(例如find,insert或remove)的操作。

结论
查询关联容器中是否可以找到一个项是一种常见的操作,而container.contains(value)是一种自然的语法。在可能的情况下,请使用该语法。

以上是关于每周小贴士#158:Abseil关联窗口和contains()的主要内容,如果未能解决你的问题,请参考以下文章

本周小贴士#90:退役标志

本周小贴士#136:无序容器

每周小贴士#153:不要使用using指令

每周小贴士#142:多参数构造函数和explicit

每周小贴士#142:多参数构造函数和explicit

每周小贴士#65:就地安放