我要做的就是检查向量中是否存在一个元素,这样我就可以处理每一种情况。
if ( item_present )
do_this();
else
do_that();
我要做的就是检查向量中是否存在一个元素,这样我就可以处理每一种情况。
if ( item_present )
do_this();
else
do_that();
当前回答
记住,如果你要做大量的查找,有STL容器会更好。我不知道你的应用程序是什么,但是像std::map这样的关联容器可能值得考虑。
vector是容器的选择,除非您有其他原因,按值查找就是这样一个原因。
其他回答
记住,如果你要做大量的查找,有STL容器会更好。我不知道你的应用程序是什么,但是像std::map这样的关联容器可能值得考虑。
vector是容器的选择,除非您有其他原因,按值查找就是这样一个原因。
下面是一个适用于任何容器的函数:
template <class Container>
const bool contains(const Container& container, const typename Container::value_type& element)
{
return std::find(container.begin(), container.end(), element) != container.end();
}
注意,您可以使用一个模板形参,因为您可以从Container中提取value_type。您需要typename,因为Container::value_type是一个依赖名称。
如果你的向量是无序的,使用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
}
二分搜索的最差情况性能为O(log n),这比第一种方法更有效。为了使用二分搜索,您可以使用qsort首先对向量排序,以确保它是有序的。
正如其他人所说,使用STL的find或find_if函数。但是如果你搜索的是非常大的向量,这会影响性能,你可能想要对你的向量排序,然后使用binary_search、lower_bound或upper_bound算法。
我个人最近使用模板一次处理多种类型的容器,而不是只处理向量。我在网上找到了一个类似的例子(不记得在哪里了),所以功劳归于我从谁那里偷来的。这种特殊的模式似乎也可以处理原始数组。
template <typename Container, typename T = typename std::decay<decltype(*std::begin(std::declval<Container>()))>::type>
bool contains(Container && c, T v)
{
return std::find(std::begin(c), std::end(c), v) != std::end(c);
}