在STL中返回索引的二进制搜索?

lir*_*n63 1 c++ binary search stl binary-search

我需要一个二进制搜索功能。

我在标准库中找不到任何函数,该函数将返回找到的项目的索引,如果找不到,将返回比我要查找的项目大的下一个元素的索引的按位补码

我要寻找的功能是什么?

编辑:我需要将一个项目插入已排序的向量并保持其排序。这就是为什么我需要按位补全索引。

Jer*_*fin 6

我敢肯定,标准库不包含任何可以完全满足您要求的内容。

要获得所需的内容,您可能要从std::lower_bound或开始std::upper_bound,并将其返回的迭代器转换为索引,然后对找不到值的索引进行补充。

  • 您可以根据自己的意愿接受或接受它-简单的事实是,标准库**并不完全包含**您所要求的内容。它只是不存在。如果需要,您需要(恐怖)编写一些代码。是的,`std :: upper_bound`只能用于按顺序插入项目。 (3认同)

Jon*_*n L 5

据我所知,没有简单的 STL 方法可以针对排序向量返回索引,但是您可以使用下面的示例函数:

/**
 * @param v - sorted vector instance
 * @param data - value to search
 * @return 0-based index if data found, -1 otherwise
*/
int binary_search_find_index(std::vector<int> v, int data) {
    auto it = std::lower_bound(v.begin(), v.end(), data);
    if (it == v.end() || *it != data) {
        return -1;
    } else {
        std::size_t index = std::distance(v.begin(), it);
        return index;
    }   
}
Run Code Online (Sandbox Code Playgroud)


UNR*_*EAL 5

这段代码应该可以正常工作

auto itr = lower_bound(v.begin(), v.end(), key) ;
index = distance(v.begin(), itr);
Run Code Online (Sandbox Code Playgroud)

有关 std::lower_bound() 的更多信息 - https://www.geeksforgeeks.org/stdlower_bound-in-c/