问题 当所有元素都应该是唯一的时,为什么STL set有count()?


我可以理解multiset有count(),用于计算值的出现次数,因为元素可以在multiset中重复。 但是,如果所有值都是唯一的,那么在集合中使用count()有什么意义呢?


3630
2017-12-03 06:42


起源



答案:


count 是的一部分 关联容器要求(1)

每个关联容器都需要将其作为其接口的一部分提供,即使结果始终为零或一个情况也是如此 std::set


(1)这是描述关联容器概念的SGI STL文档的链接; C ++标准中定义的概念可能略有不同,但并不重要。


14
2017-12-03 06:46



嗯......非功能性目的的强制性要求。他们可以用空体来实现它。奇怪... - Nav
@Nav:它不能用空体实现 std::set 因为它必须测试元素是否存在于集合中。它可以用来实现 std::set::find虽然(return find(k) != end() ? 1 : 0;)。这不是荒谬的;即使是 std::set 它告诉你容器中存在多少具有给定键的元素;它恰好发生在 std::set,答案总是零或一。 - James McNellis
值得注意的是,通过在界面中具有更多的通用性,可以更容易地编写可以与任何容器一起使用的更高级别的算法,并且更容易更改硬编码一个容器以使用另一个容器的代码。只有当操作在语义上相似时才有意义,这就是为什么STL不会让不同的容器的接口相似的原因。 - Tony Delroy
@Tony:我同意,从此开始 set 至 multiset (或相反)由于它们的通用接口很容易。 - Matthieu M.


答案:


count 是的一部分 关联容器要求(1)

每个关联容器都需要将其作为其接口的一部分提供,即使结果始终为零或一个情况也是如此 std::set


(1)这是描述关联容器概念的SGI STL文档的链接; C ++标准中定义的概念可能略有不同,但并不重要。


14
2017-12-03 06:46



嗯......非功能性目的的强制性要求。他们可以用空体来实现它。奇怪... - Nav
@Nav:它不能用空体实现 std::set 因为它必须测试元素是否存在于集合中。它可以用来实现 std::set::find虽然(return find(k) != end() ? 1 : 0;)。这不是荒谬的;即使是 std::set 它告诉你容器中存在多少具有给定键的元素;它恰好发生在 std::set,答案总是零或一。 - James McNellis
值得注意的是,通过在界面中具有更多的通用性,可以更容易地编写可以与任何容器一起使用的更高级别的算法,并且更容易更改硬编码一个容器以使用另一个容器的代码。只有当操作在语义上相似时才有意义,这就是为什么STL不会让不同的容器的接口相似的原因。 - Tony Delroy
@Tony:我同意,从此开始 set 至 multiset (或相反)由于它们的通用接口很容易。 - Matthieu M.