为什么在C ++中没有找到vector

时间:2010-06-08 00:25:42

标签: c++ stl stdvector

有什么替代方案?

我应该自己写作吗?

6 个答案:

答案 0 :(得分:42)

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()来获取向量中的元素范围的开始和结束迭代器那个价值。

答案 1 :(得分:21)

没有vector::find的原因是因为std::find没有算法优势(std::findO(N),一般来说,你不能做得更好)。

但您map::find的原因是因为它可以提高效率(map::findO(log N)所以您总是希望将std::find用于地图。

答案 2 :(得分:8)

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

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

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

答案 3 :(得分:4)

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

不要忘记包含 <algorithm>

答案 4 :(得分:4)

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

然而,由于'Herb'在Namespace Principle中陈述,'find'是接口的一部分,它被定义在与'vector'相同的名称空间中,即'std'。

答案 5 :(得分:2)

  

有什么替代方案?

标准提供了std :: find,用于顺序搜索任意序列的like-elements(或类似的东西)。

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

  

为什么在C ++中没有找到vector?

创建std::vector<???>::find没有意义,因为实施与std::find(vector.begin(), vector.end(), value_to_find);相同。

  

我应该自己写作吗?

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