C++ 如何在排序的C++;以最有效的方式使用向量?
我已经看了和,但是find没有利用向量被排序的事实,二进制搜索只返回true或false,而不是在哪里找到值。有什么函数可以让我两全其美吗?您可以使用find在时间O(N)内查找任何容器中的特定元素。使用vector,您可以进行随机访问,并利用std算法的下限(log2(N))、上限或相等范围类。我会帮你的。它位于二进制搜索顶部的等效行为部分。然而,BialySype的效用仅限于“是”和“否”(可能是在C++的未来版本中需要改进的名称;如果该对中的两个项目相同,则您要查找的值不存在。C++ 如何在排序的C++;以最有效的方式使用向量?,c++,sorting,search,vector,find,C++,Sorting,Search,Vector,Find,我已经看了和,但是find没有利用向量被排序的事实,二进制搜索只返回true或false,而不是在哪里找到值。有什么函数可以让我两全其美吗?您可以使用find在时间O(N)内查找任何容器中的特定元素。使用vector,您可以进行随机访问,并利用std算法的下限(log2(N))、上限或相等范围类。我会帮你的。它位于二进制搜索顶部的等效行为部分。然而,BialySype的效用仅限于“是”和“否”(可能是在C++的未来版本中需要改进的名称;如果该对中的两个项目相同,则您要查找的值不存在。templa
template
template<class T, class U>
bool contains(const std::vector<T>& container, const U& v)
{
auto it = std::lower_bound(
container.begin(),
container.end(),
v,
[](const T& l, const U& r){ return l < r; });
return it != container.end() && *it == v;
}
布尔包含(常量标准::向量和容器,常量U&v)
{
自动it=std::下限(
container.begin(),
container.end(),
v
[](常量T&l,常量U&r){return l
查看您提到的二进制搜索
页面的底部。“另请参阅”部分。也许您想看看这个:@elimirks您的请求可以用更礼貌的措辞表达。如果你没有时间来描述你所追求的,不要考虑评论。欢迎使用StackOverflow解决此问题不需要额外的上下文。请记住,它提供了大于或等于val的元素,因此您仍然需要检查它是否存在。但这可能比使用std::equal_range()
std::equal_range
更有效,因为它不足以检查是否存在,而且性能更差。除非您有充分的理由使用std::equal_range
,否则二进制搜索应首选std::lower_bound
。如果std::distance(res.first,res.second)==1,则只找到一项。如果第一个和第二个相同,则距离为0,但情况并非如此。见“返回值”在这不是一个好答案。如果我要搜索6
的值,但我的集合只包含5
和7
,该怎么办。这一对将被返回(而不是set.end()
),并且不会是失败的二进制搜索。除了查看值之外,没有其他方法可以知道它是否真的找到了5
或中间的某个东西。因此std::lower_bound
应该足够了。但它仍然执行2*log(N)而不是简单的log(N)对于自制的二进制搜索?我说得对吗?它没有回答OP问题(即询问在向量中找到值的索引),它正在做已经在做的事情