Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在排序的C++;以最有效的方式使用向量?_C++_Sorting_Search_Vector_Find - Fatal编程技术网

C++ 如何在排序的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

我已经看了和,但是find没有利用向量被排序的事实,二进制搜索只返回true或false,而不是在哪里找到值。有什么函数可以让我两全其美吗?

您可以使用find在时间O(N)内查找任何容器中的特定元素。使用vector,您可以进行随机访问,并利用std算法的下限(log2(N))、上限或相等范围类。我会帮你的。它位于二进制搜索顶部的等效行为部分。然而,BialySype的效用仅限于“是”和“否”(可能是在C++的未来版本中需要改进的名称;如果该对中的两个项目相同,则您要查找的值不存在。

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问题(即询问在向量中找到值的索引),它正在做已经在做的事情