std::vector
没有成员函数find
有什么特别的原因吗?相反,您必须致电std::find
(和#include <algorithm>
)。
我之所以要问的是,我认为能够在某些实现中更改容器类是一件好事,而无需在访问容器的任何地方更改代码。假设我将实现使用std::vector
的{{1}}替换为std::find
。然后,我还必须通过调用成员std::map
来替换std::find
的调用,除非我想保持find
的线性复杂度。为什么不为所有容器类都有一个成员std::find
,它找到一个最适合每个容器的算法的元素?
答案 0 :(得分:5)
从概念上讲,std::find
只需要两个InputIterator
即可,而不是std::vector
。因此,一个实现适用于所有容器,包括STL容器,和标准数组,以及任何可以提供InputIterator
的容器,包括例如istream_iterator()
- 很好!
因此,不是为每个容器提供一个find()
方法(并考虑到某些方法可能不可能,如标准数组),而是为所有容器提供单个通用find()
函数。这可能使您的代码比为每个容器添加find()
方法更具弹性,因为它为任何集合中的搜索提供了一致的接口:来自控制台,网络等的输入流,或者只是基本数组。这是STL 通用设计理念的一个重要方面:您可以搜索由两个InputIterator
定义的任何集合/范围中的元素。
正如您所指出的,缺点是在某些情况下,使用容器自己的方法可以实现更好的性能,这可以做出特殊假设以提高性能(类似于list::remove
,{{ 1}}等。出于这个原因,容器可以提供(这是STL的一个众所周知的设计特性)方法,特别是出于性能原因:例如,unorderd_map::remove/find()
不需要迭代整个方法map来查找元素。
总之,由于通用std::unordered_map
对向量有效,因此不需要提供成员函数,因为它可能会强制执行更少的可移植设计。
对于与STL相关的所有事情,请参阅The C++ Standard Library - A Tutorial and Reference, 2nd Edition
答案 1 :(得分:0)
std :: find是一种常见的解决方案。有些类需要对这个函数进行某种特殊化,这就是为什么它们在本地有它们(因为我记得Meyers说如果一个类有自己的函数成员那么你应该使用它而不是全局定义)