bool exists_linear( INPUT_ITERATOR first, INPUT_ITERATOR last, const T& value )
bool exists_binary( INPUT_ITERATOR first, INPUT_ITERATOR last, const T& value )
我认为这些功能显而易见 .
include <newton/algorithm/algorithm.hpp>
if ( newton::exists_linear(first, last, value) )
do_this();
else
do_that();
1
如果您的矢量未订购,请使用MSN建议的方法:
if(std::find(vector.begin(), vector.end(), item)!=vector.end()){
// Found the item
}
如果您的矢量是有序的,请使用binary_search方法Brian Neal建议:
if(binary_search(vector.begin(), vector.end(), item)){
// Found the item
}
17 回答
使用stl的算法头中的find . 我已经用int类型说明了它的用法 . 您可以使用您喜欢的任何类型,只要您可以比较相等(如果您需要自定义类,则重载==) .
使用boost,您可以使用any_of_equal:
如果你想在向量中找到一个字符串:
正如其他人所说,使用STL find或find_if函数 . 但是,如果要搜索非常大的向量并且这会影响性能,则可能需要对向量进行排序,然后使用binary_search,lower_bound或upper_bound算法 .
请记住,如果您要进行大量查找,那么有更好的STL容器 . 我不知道你的应用程序是什么,但像std :: map这样的关联容器可能值得考虑 .
std :: vector是选择的容器,除非你有另一个的理由,并且按值查找可能是这样的原因 .
在C 11中,您可以使用
any_of
. 例如,如果它是vector<string> v;
则:使用Newton C++它比使用std :: find更容易,自我记录并且更快,因为直接返回bool .
我认为这些功能显而易见 .
如果您的矢量未订购,请使用MSN建议的方法:
如果您的矢量是有序的,请使用binary_search方法Brian Neal建议:
二进制搜索产生O(log n)最坏情况性能,这比第一种方法更有效 . 为了使用二进制搜索,您可以使用qsort对向量进行排序,以保证它是有序的 .
你可以试试这段代码:
使用C运算符的另一个示例
这是一个适用于任何Container的函数:
请注意,您可以使用1个模板参数,因为您可以从Container中提取
value_type
. 你需要typename
因为Container::value_type
是dependent name .您可以使用std::find std::find:
这将返回一个bool(
true
如果存在,否则为false
) . 用你的例子:使用STL find功能 .
请记住,还有一个find_if函数,如果您的搜索更复杂,可以使用它,例如,如果您不只是查找元素,但是,例如,想要查看是否存在满足某个元素的元素condition,例如,以"abc"开头的字符串 . (
find_if
会给你一个指向第一个这样的元素的迭代器) .你也可以使用伯爵 . 它将返回向量中存在的项目数 .
我用这样的东西......
......就这样,它实际上清晰可读 . (显然,您可以在多个位置重复使用模板) .
您可以使用
std
命名空间中的find函数,即std::find
. 您从要搜索的向量中传递std::find
和end
迭代器的std::find
函数以及您要查找的元素,并将得到的迭代器与向量的末尾进行比较,以查看它们是否匹配 .您还可以解除引用迭代器并像往常一样使用它,就像任何其他迭代器一样 .