C++ 在向量中查找项
我有一个实值向量,按递增顺序排序 这些值可以在C++ 在向量中查找项,c++,sorting,c++11,search,binary-search,C++,Sorting,C++11,Search,Binary Search,我有一个实值向量,按递增顺序排序 这些值可以在[0,1]范围内。然后我在这个范围内选择一个值x,我需要找出哪个是较小值的索引大于或等于x 我可以通过迭代整个数组来解决此问题: vector<double> values; double x; for (auto val : values) { if (x <= values) { // found break; } } 向量值; 双x; 用于(自动值:值) { 如果(x
[0,1]
范围内。然后我在这个范围内选择一个值x
,我需要找出哪个是较小值的索引大于或等于x
我可以通过迭代整个数组来解决此问题:
vector<double> values;
double x;
for (auto val : values)
{
if (x <= values)
{
// found
break;
}
}
向量值;
双x;
用于(自动值:值)
{
如果(x您知道SO不是一个您请求他人为您编写代码的站点,那么请以以下示例为例:
// binary_search example
#include <iostream> // std::cout
#include <algorithm> // std::binary_search, std::sort
#include <vector> // std::vector
bool myfunction (int i,int j) { return (i<j); }
int main () {
int myints[] = {1,2,3,4,5,4,3,2,1};
std::vector<int> v(myints,myints+9); // 1 2 3 4 5 4 3 2 1
// using default comparison:
std::sort (v.begin(), v.end());
std::cout << "looking for a 3... ";
if (std::binary_search (v.begin(), v.end(), 3))
std::cout << "found!\n"; else std::cout << "not found.\n";
// using myfunction as comp:
std::sort (v.begin(), v.end(), myfunction);
std::cout << "looking for a 6... ";
if (std::binary_search (v.begin(), v.end(), 6, myfunction))
std::cout << "found!\n"; else std::cout << "not found.\n";
return 0;
}
//二进制搜索示例
#include//std::cout
#包括//标准::二进制搜索,标准::排序
#include//std::vector
bool-myfunction(inti,intj){return(i你可以像数组一样直接访问向量中的项,而不是从一开始就使用迭代器。我假设你已经知道二进制搜索。在数组中实现它是你可以在任何地方找到的东西,所以我在这里不向你解释。只需将向量视为数组。使用:
#包括
#包含函数下限可能满足您的需求,您可以按如下方式使用它:
iter =lower_bound(values.begin(),values.end(),x);
不一定更快,但更具可读性:binary_search
应该如何返回索引?从@PiotrSkotnicki的问题中,我了解这足以找到元素,还是不找到。“我需要找到哪个索引的值越小,越大或等于x。”哦,该死的@PiotrSkotnicki,你是对的!我被这个例子愚弄了。你认为我应该删除答案吗?或者在你的评论中留下一条注释?如何使用操作符[]
帮助找到比问题解决方案更好的所需元素的索引?@AlexanderStepaniuk您不需要从向量的开头开始并对其进行扫描。您可以从向量的中间开始执行二进制搜索,它以O(对数n)而不是O(n)的形式运行.为什么这个方法应该更快?@Nick,因为它使用随机访问类的迭代器执行二进制搜索。不,我花了太多时间键入那些简单的句子,因为我的英语水平很高(╯﹏╰)
iter =lower_bound(values.begin(),values.end(),x);