在std :: vector中找不到成员

时间:2016-08-12 12:06:51

标签: c++ std stdvector

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

我之所以要问的是,我认为能够在某些实现中更改容器类是一件好事,而无需在访问容器的任何地方更改代码。假设我将实现使用std::vector的{​​{1}}替换为std::find。然后,我还必须通过调用成员std::map来替换std::find的调用,除非我想保持find的线性复杂度。为什么不为所有容器类都有一个成员std::find,它找到一个最适合每个容器的算法的元素?

2 个答案:

答案 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说如果一个类有自己的函数成员那么你应该使用它而不是全局定义)