Binary search algorithm in C source code

本文介绍了一种高效的二分查找算法实现过程,包括算法原理、代码实现及应用实例,通过具体代码展示了如何在有序数组中进行元素查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#define OK 1
#define ERROR 0

/*BinarySearch Algorithm*/
int binarySearch(int e, int arr[], int lo, int hi)
{
    int mi;
    if(lo < hi)
    {
        mi = (lo + hi) / 2;
        if(e < arr[mi]) 
            return  binarySearch(e, arr, lo, mi);   //The element we find is located  in the left of mi,and then implements decrease-and-conquer.
        else if(arr[mi] < e) 
            return  binarySearch(e, arr, mi+1, hi);  //The element we find is located  in the right of mi,and then implements decrease-and-conquer.
        else return mi;
    }
    else return -1;     //It indicates that we fail to find element.
}

int main()
{
    int subscr;
    int arr[10] = {2,4,5,6,8,11,13,14,42,50};
    subscr = binarySearch(42, arr, 0, 10);//We use subscr to return the result of function call.
    printf("%d",subscr);//If we find the element,we print the subscript of the element,else we print -1.
    return 0;
}
<think>嗯,用户遇到了C++ STL编译错误,具体是stl_algo.h中的显式模板参数列表声明错误,错误代码891。我需要先理解这个错误的原因。根据用户提供的引用[2],可能和const正确性或函数对象的声明有关。比如,用户可能在自定义的函数对象中没有正确声明const成员函数,或者在模板参数传递时类型不匹配。 首先,stl_algo.h属于STL的内部实现文件,用户代码中的错误可能间接导致这里报错。常见的错误来源包括自定义的比较函数或谓词不符合STL的要求,比如缺少const修饰符,或者继承自binary_function/unary_function不正确。例如,用户可能在operator()后面忘记加const,导致无法在const对象上调用,引发编译器错误。 另外,显式模板参数列表错误可能是指用户在调用STL算法时,错误地指定了模板参数,导致编译器无法推断正确的类型。例如,使用std::sort时,如果显式指定了比较函数的类型,但实际参数不匹配,就会出错。需要检查模板实例化是否正确,参数是否匹配。 解决方案可能包括:检查自定义函数对象的operator()是否声明为const,确保在const上下文中可用;检查是否正确地继承了binary_function或unary_function(虽然C++11后这些可能被弃用,但旧代码可能需要);确认模板参数是否多余,是否应该让编译器自动推导;以及检查包含头文件的顺序或是否有宏定义干扰了STL代码。 还要考虑用户是否在代码中误用了保留关键字或宏,比如可能有某个宏在包含STL头文件之前被定义,导致替换了STL内部的模板参数,引发语法错误。例如,#define或typedef可能干扰了模板参数的正常解析。 此外,查看错误代码891的具体信息可能会有帮助,但用户没有提供完整的错误信息。可能需要建议用户检查编译器的完整输出,定位到具体的代码行,检查该行的模板参数是否正确,函数对象是否符合要求。 总结可能的解决步骤:1. 检查自定义函数对象的const正确性;2. 确保没有错误地显式指定模板参数;3. 检查宏定义或其他预处理指令的影响;4. 更新编译器或检查语法是否符合标准。</think>针对C++ STL编译报错`stl_algo.h`中的**显式模板参数列表声明错误(错误代码891)**,以下是分步解决方案: --- ### 1. **检查自定义函数对象的`const`正确性** - **问题根源**:STL算法(如`std::sort`)要求传入的**比较函数或谓词**必须为`const`成员函数,否则在常量上下文中调用会导致类型不匹配[^2]。 - **示例修正**: ```cpp // 错误:operator()未声明为const struct Compare { bool operator()(int a, int b) { return a < b; } }; // 正确:添加const修饰符 struct Compare { bool operator()(int a, int b) const { return a < b; } }; ``` --- ### 2. **验证模板参数是否显式指定错误** - **问题根源**:显式指定模板参数时,若类型与函数参数不匹配,会触发模板推导失败。例如,错误地指定`std::sort`的比较函数类型: ```cpp // 错误:显式指定了Compare类型,但第三个参数应为实例化的对象 std::sort<Compare>(arr.begin(), arr.end()); // 正确:让编译器自动推导模板参数 std::sort(arr.begin(), arr.end(), Compare()); ``` --- ### 3. **检查函数对象继承关系(C++11前代码)** - **问题根源**:旧版C++要求函数对象继承`binary_function`或`unary_function`以适配STL算法(如`bind1st`)。若不继承,可能引发模板参数不兼容。 - **示例修正**: ```cpp // 正确:继承binary_function并声明参数类型 struct Compare : public std::binary_function<int, int, bool> { bool operator()(int a, int b) const { return a < b; } }; ``` --- ### 4. **排查宏定义或头文件污染** - **问题根源**:用户可能通过`#define`重定义了STL内部关键字(如`const`或`typename`),或在包含STL头文件前引入了冲突的宏。 - **解决方法**: - 检查代码中是否有`#define`覆盖了保留字。 - 确保在包含STL头文件(如`<algorithm>`)前未定义冲突宏。 --- ### 5. **更新编译器或调整语言标准** - **问题根源**:旧编译器(如GCC 4.x)对模板参数检查不严格,而新版编译器(GCC 11+或Clang)会严格匹配C++标准。 - **解决方法**: - 升级编译器至支持C++11或更高版本。 - 编译时添加标准选项:`-std=c++17`。 --- ### 6. **参考错误代码定位具体行** - 若错误指向`stl_algo.h`中的某行(如`template explicit void sort(_RAIter, _RAIter, _Compare)`),需检查: 1. 用户传入的比较函数签名是否与`_Compare`类型匹配。 2. 是否在模板参数中混用了`const`和非`const`类型。 --- ### 示例完整修正 ```cpp #include <algorithm> #include <vector> // 正确:const成员函数 + 继承binary_function(旧版需要) struct Compare : public std::binary_function<int, int, bool> { bool operator()(int a, int b) const { return a < b; } }; int main() { std::vector<int> arr = {3, 1, 4}; // 正确:不显式指定模板参数 std::sort(arr.begin(), arr.end(), Compare()); return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值