有什么替代方案?
我应该自己写作吗?
答案 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::find
是O(N)
,一般来说,你不能做得更好)。
但您map::find
的原因是因为它可以提高效率(map::find
为O(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实现。