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);