12

有什么选择?

我应该自己写吗?

4

6 回答 6

46

有一种std::find()算法,它在迭代器范围内执行线性搜索,例如,

std::vector<int> v;

// Finds the first element in the vector that has the value 42:
// If there is no such value, it == v.end()
std::vector<int>::const_iterator it = std::find(v.begin(), v.end(), 42);

如果您的向量已排序,您可以使用它std::binary_search()来测试向量中是否存在值,并std::equal_range()获取向量中具有该值的元素范围的开始和结束迭代器。

于 2010-06-08T00:27:20.190 回答
26

没有的原因vector::find是因为没有算法上的优势std::findstd::find通常O(N),你不能对向量做得更好)。

但是您拥有的原因map::find是因为它可以更有效(map::find因此O(log N)您总是希望将其std::find用于地图)。

于 2010-06-08T00:30:46.260 回答
8

谁告诉你的?C++ 中有“查找”算法vector讽刺地巧合的是,它被称为std::find。或者也许std::binary_search。或其他,取决于存储在向量中的数据的属性。

只有当算法的有效实现以某种方式与容器的内部细节相关联时,容器才会获得自己特定版本的通用算法(作为容器方法实现)。std::list<>::sort就是一个例子。

在所有其他情况下,算法由独立函数实现。

于 2010-06-08T00:30:42.710 回答
4

在容器类中具有“查找”功能违反了“ SRP ”(单一责任原则)。容器的核心功能是为容器中的元素的存储、检索提供接口。“查找”、“排序”、“迭代”等不是任何容器的核心功能,因此不是它直接接口的一部分。

然而,正如命名空间原则中的“Herb”所述,“find”是接口的一部分,因为它与“vector”即“std”在相同的命名空间中定义。

于 2010-09-19T06:22:31.110 回答
4

使用std::find(vec.begin(), vec.end(), value).

不要忘记包括 <algorithm>

于 2010-06-08T00:28:09.377 回答
3

有什么选择?

该标准提供std::find,用于对任意序列的相似元素(或类似元素)进行顺序搜索。

这可以应用于所有支持迭代器的容器,但对于内部排序的容器(如std::map),可以优化搜索。在这种情况下,容器提供它自己的find成员函数。

为什么在 C++ 中找不到向量?

创建 a 没有意义,std::vector<???>::find因为实现将与std::find(vector.begin(), vector.end(), value_to_find);.

我应该自己写吗?

不可以。除非您有特定的限制或要求,否则您应该尽可能使用 STL 实现。

于 2010-06-08T09:06:03.600 回答