有什么选择?
我应该自己写吗?
有一种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()
获取向量中具有该值的元素范围的开始和结束迭代器。
没有的原因vector::find
是因为没有算法上的优势std::find
(std::find
通常O(N)
,你不能对向量做得更好)。
但是您拥有的原因map::find
是因为它可以更有效(map::find
因此O(log N)
您总是希望将其std::find
用于地图)。
谁告诉你的?C++ 中有“查找”算法vector
。讽刺地巧合的是,它被称为std::find
。或者也许std::binary_search
。或其他,取决于存储在向量中的数据的属性。
只有当算法的有效实现以某种方式与容器的内部细节相关联时,容器才会获得自己特定版本的通用算法(作为容器方法实现)。std::list<>::sort
就是一个例子。
在所有其他情况下,算法由独立函数实现。
在容器类中具有“查找”功能违反了“ SRP ”(单一责任原则)。容器的核心功能是为容器中的元素的存储、检索提供接口。“查找”、“排序”、“迭代”等不是任何容器的核心功能,因此不是它直接接口的一部分。
然而,正如命名空间原则中的“Herb”所述,“find”是接口的一部分,因为它与“vector”即“std”在相同的命名空间中定义。
使用std::find(vec.begin(), vec.end(), value)
.
不要忘记包括 <algorithm>
有什么选择?
该标准提供std::find,用于对任意序列的相似元素(或类似元素)进行顺序搜索。
这可以应用于所有支持迭代器的容器,但对于内部排序的容器(如std::map
),可以优化搜索。在这种情况下,容器提供它自己的find
成员函数。
为什么在 C++ 中找不到向量?
创建 a 没有意义,std::vector<???>::find
因为实现将与std::find(vector.begin(), vector.end(), value_to_find);
.
我应该自己写吗?
不可以。除非您有特定的限制或要求,否则您应该尽可能使用 STL 实现。