3

我正在使用集合,因为我想使用已排序容器(例如集合)的快速查找属性。我想知道是否必须使用 find 成员方法来获得排序容器的好处,还是我也可以在 STL 算法中使用静态 find 方法?

我的预感是使用静态版本将使用线性搜索而不是我想要的二进制搜索。

4

2 回答 2

8

没错,非会员版本进行线性搜索,而会员版本将进行 O(log N) 搜索。std::set 针对 O(log N) 的插入、检索和删除进行了优化。

作为定义点, std::find 方法不是静态函数。有关静态在 C++ 中的各种含义的描述,请参见此处。

于 2009-01-20T17:30:11.527 回答
2

这是依赖于实现的,因为有人可能已经为静态“查找”实现了部分特化,该静态“查找”在集合上使用二进制搜索,但考虑到所有因素,成员函数版本可能会执行得更好。

IIRC,Scott Meyers 在他的“Effective STL”一书中建议始终更喜欢 find、swap 等常用函数的成员版本而不是非成员函数,因为与非成员版本相比,它们更有可能是最佳实现并且您通常可以依靠成员版本的性能优势,而您不能总是依靠将存在给定函数的部分特化这一事实。

于 2009-01-20T17:42:03.813 回答