vector中没有查找成员
No find member in std::vector
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说过,如果一个类有自己的函数成员,那么你应该使用它,而不是全局定义)
- 不明确的成员模板查找
- enable_if继承的成员函数的名称查找错误
- 如何处理具有不同类的成员函数的函数查找表?
- C++中成员名称查找和访问声明中的歧义
- 如何通过也在向量中的指针查找作为类成员的向量的大小
- 算法在容器中查找具有给定值的元素之一的成员
- 如何使用 Clang 查找所有成员字段读/写?
- 如何查找一组类型对是否包含一个元素作为第二个成员
- 如何在具有多个成员的自定义对象的向量上使用查找
- 在C++中查找紧密成员函数名称
- 类(模板)成员函数体内部的ADL查找
- 动态链接到 c++ 静态成员字段时符号查找失败
- C++ 在向量中查找对象并在其上调用成员函数
- 查找初始化列表中的哪个成员抛出了例外
- 如何使用模板专业化来查找成员函数参数类型等
- 如何"reset" std::string的查找成员函数,一旦它到达字符串的末尾
- 设置查找成员与在列表中使用查找
- vector中没有查找成员
- Jsoncpp查找成员函数
- (C++Boost)在列表中查找成员与搜索词匹配的项目