2016-11-18 17 views
2

我们可以在std::set上使用std::find,但它可能会很慢,因为std::set的成员函数std::set::find通常比std::find更快。是std :: find仅适用于其元素可能未被排序的容器?

std::find仅适用于其元素可能未被排序的容器,例如, std::list

可以std::find阻止用户使用它来找到std::set上的东西吗?

+0

*要求*在这里http://en.cppreference.com/w/cpp/algorithm/find,虽然它不完全清楚你在问什么。 – juanchopanza

+0

'unoredered_set'和'unordered_map'呢? – juanchopanza

+0

std :: find根本不适合容器,它接收一对迭代器。这些迭代器只需要满足InputIterator的要求。没有什么需要随机访问或利用它。 –

回答

2

一般来说,你可以使用的std ::发现所有这些为您提供输入迭代容器。 Here是关于std :: info及其迭代器要求的信息。

主要问题是有效性。该算法不知道任何有关它所使用的容器的内部表示。因此std :: find只是迭代特定容器的元素。没有办法阻止它处理容器,如std :: set。而且,这与STL的设计相矛盾。

作为一般规则,您应该将容器方法更改为具有相同名称的算法。

2

无论容器如何,在最坏的情况下,std :: find()总是会使用O(n),因为它下面只做线性迭代搜索,并比较迭代器指向的值。

因此,它无法利用该容器中的元素是否已排序。

而且不,std::find不会阻止用户找到std::set上的东西。

相关问题