【发布时间】:2009-01-20 17:23:55
【问题描述】:
我使用集合是因为,我想使用已排序容器(例如集合)的快速查找属性。我想知道我是否必须使用 find 成员方法来获得排序容器的好处,还是我也可以在 STL 算法中使用静态 find 方法?
我的预感是使用静态版本将使用线性搜索而不是我想要的二进制搜索。
【问题讨论】:
标签: c++ algorithm stl stl-algorithm
我使用集合是因为,我想使用已排序容器(例如集合)的快速查找属性。我想知道我是否必须使用 find 成员方法来获得排序容器的好处,还是我也可以在 STL 算法中使用静态 find 方法?
我的预感是使用静态版本将使用线性搜索而不是我想要的二进制搜索。
【问题讨论】:
标签: c++ algorithm stl stl-algorithm
non-member version 进行线性搜索是对的,而成员版本将进行 O(log N) 搜索。 std::set 针对 O(log N) 的插入、检索和删除进行了优化。
作为定义点,std::find 方法不是静态函数。请参阅此处了解 the various things static 在 C++ 中的含义。
【讨论】:
这取决于实现,因为有人可能已经为静态“查找”实现了部分特化,该静态“查找”在集合上使用二分搜索,但考虑到所有因素,成员函数版本可能会执行得更好。
IIRC,Scott Meyers 在他的“Effective STL”一书中建议始终更喜欢 find、swap 等常用函数的成员版本而不是非成员函数,因为与非成员函数相比,它们更有可能是最佳实现。 - 成员版本和您通常可以依赖成员版本的性能优势,而您不能总是依赖于存在给定函数的部分特化这一事实。
【讨论】: