在 std::vector 中找不到成员
No find member in std::vector
std::vector
没有成员函数find
有什么特别的原因吗?相反,您必须调用 std::find
(和 #include <algorithm>
)。
我问的原因是我认为能够在某些实现中更改容器 class 而不必更改访问容器的代码的地方是一件好事。假设我将实现使用 std::find
的 std::vector
替换为 std::map
。然后我还必须用对成员 find
的调用替换 std::find
的调用,除非我想保持 std::find
的线性复杂度。为什么不只为所有容器classes 设置一个成员find
,它会找到一个元素,该元素具有最适合每个容器的任何算法?
std::find 是一个常见的解决方案。一些 classes 需要对这个函数进行某种特殊化,所以这就是为什么他们在本地使用它们(我记得迈耶斯说过,如果 class 有自己的函数成员,那么你应该使用它而不是全局定义)
概念上,std::find
only requires two InputIterator
s 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::remove
,unorderd_map::remove/find()
ETC。)。出于这个原因,容器可以提供(这是 STL 的一个众所周知的设计特征)一种方法 专门用于性能原因 :例如 std::unordered_map
不需要迭代通过整个地图找到一个元素。
总而言之,由于泛型 std::find
对向量有效,因此无需提供成员函数,因为它可能会强制执行更不便携的设计。
对于所有与 STL 相关的内容,请参阅 The C++ Standard Library - A Tutorial and Reference, 2nd Edition
std::vector
没有成员函数find
有什么特别的原因吗?相反,您必须调用 std::find
(和 #include <algorithm>
)。
我问的原因是我认为能够在某些实现中更改容器 class 而不必更改访问容器的代码的地方是一件好事。假设我将实现使用 std::find
的 std::vector
替换为 std::map
。然后我还必须用对成员 find
的调用替换 std::find
的调用,除非我想保持 std::find
的线性复杂度。为什么不只为所有容器classes 设置一个成员find
,它会找到一个元素,该元素具有最适合每个容器的任何算法?
std::find 是一个常见的解决方案。一些 classes 需要对这个函数进行某种特殊化,所以这就是为什么他们在本地使用它们(我记得迈耶斯说过,如果 class 有自己的函数成员,那么你应该使用它而不是全局定义)
概念上,std::find
only requires two InputIterator
s 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::remove
,unorderd_map::remove/find()
ETC。)。出于这个原因,容器可以提供(这是 STL 的一个众所周知的设计特征)一种方法 专门用于性能原因 :例如 std::unordered_map
不需要迭代通过整个地图找到一个元素。
总而言之,由于泛型 std::find
对向量有效,因此无需提供成员函数,因为它可能会强制执行更不便携的设计。
对于所有与 STL 相关的内容,请参阅 The C++ Standard Library - A Tutorial and Reference, 2nd Edition