vector中没有查找成员

No find member in std::vector

本文关键字:查找 成员 vector      更新时间:2023-10-16

std::vector没有成员函数find有什么特别的原因吗?相反,您必须调用std::find(和#include <algorithm>)。

我问这个问题的原因是,我认为能够在某些实现部分更改容器类,而不必在访问容器的任何地方更改代码,这将是一件好事。假设我将std::vector替换为std::map,其中实现使用std::find。然后,我还必须将std::find的调用替换为对成员find的调用,除非我想保持std::find的线性复杂性。为什么不为所有容器类都有一个成员find,它可以用最适合每个容器的算法找到元素?

从概念上讲,std::find只需要两个InputIterator s来工作,而不是一个std::vector。因此,一个实现适用于所有容器,包括STL容器、和标准数组,以及任何可以提供InputIterator的容器,包括例如istream_iterator()——很好!

因此,不是为每个容器提供一个find()方法(并考虑到有些容器可能不可能,如标准数组),而是为所有容器提供一个单一的通用find()函数。这可能使您的代码比为每个容器添加find()方法更有弹性,因为它提供了一个一致的接口来搜索任何集合:来自控制台、网络等的输入流,或者只是一个基本的数组。这是STL 通用设计理念的一个重要方面:您可以搜索由两个InputIterator s定义的任何集合/范围中的元素。

缺点,正如您注意到的,是在某些情况下,使用容器自己的方法可以获得更好的性能,它可以做出特殊的假设来提高性能(类似于list::remove, unorderd_map::remove/find()等)。出于这个原因,容器可以提供(这是STL的一个众所周知的设计特性)一个专门出于性能原因的方法:例如,std::unordered_map不要求迭代遍历整个映射来查找元素。

总之,由于泛型std::find对于vector有效地工作,因此不需要提供成员函数,因为它可能会强制更差的可移植设计。

有关STL的所有内容,请参阅c++标准库-教程和参考,第二版

std::find是一个常见的解决方案。有些类需要对这个函数进行某种专门化这就是为什么它们有局部的(我记得Meyers说过,如果一个类有自己的函数成员,那么你应该使用它,而不是全局定义)