在 std::vector 中找不到成员

No find member in std::vector

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

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

std::find 是一个常见的解决方案。一些 classes 需要对这个函数进行某种特殊化,所以这就是为什么他们在本地使用它们(我记得迈耶斯说过,如果 class 有自己的函数成员,那么你应该使用它而不是全局定义)

概念上,std::find only requires two InputIterators to work and not an std::vector. As such, one implementation works for all containers including STL containers, and standard arrays, and anything that can supply an InputIterator, including for example an istream_iterator() - 很好!

因此,不是为每个容器提供一个 find() 方法(并考虑到对于某些容器可能无法实现,例如标准数组),而是提供一个单一的通用 find() 函数对所有人。与为每个容器添加 find() 方法相比,这可能使您的代码更容易更改,因为它提供了一致的界面来搜索任何集合:来自控制台、网络等的输入流,或只是一个基本数组。这是 STL generic design 哲学的一个重要方面:您可以在由两个 [=11] 定义的任何 collection/range 中搜索元素=]s.

正如您所指出的,缺点是在某些情况下,使用容器自己的方法可能会获得更好的性能,它可以做出特殊假设以提高性能(类似于 list::removeunorderd_map::remove/find() ETC。)。出于这个原因,容器可以提供(这是 STL 的一个众所周知的设计特征)一种方法 专门用于性能原因 :例如 std::unordered_map 不需要迭代通过整个地图找到一个元素。

总而言之,由于泛型 std::find 对向量有效,因此无需提供成员函数,因为它可能会强制执行更不便携的设计。

对于所有与 STL 相关的内容,请参阅 The C++ Standard Library - A Tutorial and Reference, 2nd Edition