zoukankan      html  css  js  c++  java
  • C++ 实现带监视哨的顺序查找

    之前在牛客网上做习题发现的这个独特的顺序查询,第一次听到“监视哨”这个说法,就查了一下

    具体实现就是将数组的第0位置空,在查找时将要查找的key插入作为监视哨

    这样的好处是不用每次循环都检查查找是否结束,减少了元素比较次数,

    最后的返回值要么是元素下标要么是数组第0位(这种情况就是到了监视哨)

    以下是我的代码

     1 #include <iostream> 
     2 using namespace std;
     3 
     4 template<class T>
     5 int linear_search(T& arr,int key)
     6 {
     7     int length = sizeof(arr) / sizeof(arr[0]);
     8     int i = length;
     9     arr[0] = key;
    10     while (arr[i] != key)
    11     {
    12         i--;
    13     }
    14     return i;
    15 }
    16 
    17 int main()
    18 {
    19     int array[] = { 0, 7,9,10,11,15 };
    20     int len = sizeof(array) / sizeof(array[0]);
    21     cout << linear_search(array, 10);
    22     return 0;
    23 }

    这里顺带提一下,vs2019会出现一个

    error C2760: 语法错误: 意外的令牌“标识符”,预期的令牌为“;”

    的错误,具体原理我不是很懂,单给出一个解决办法:

    项目->属性->C/C++->语言->符合模式->否

    最后给自己提一下醒,数组作为函数参数是传入数组首位的指针,指针是不带有数组其他属性的,

    所以要在函数内获得数组的长度,只能用引用和模板的形式传入数组本身,这样就能用sizeof()获取数组长度了

  • 相关阅读:
    CentOS7安装iptables防火墙
    Linux下ntpdate时间同步
    linux下的时间及时区设置
    linux下的DNS
    sysctl
    ab -n -c
    VIM 中 查看{}是否闭合,按%跳转到下个闭合
    要删除共享的初始登陆名 cmd下输入net use * /delete
    case in esac ` for in do done ` while true / false
    read op case $op in
  • 原文地址:https://www.cnblogs.com/misaki-workshop/p/12574360.html
Copyright © 2011-2022 走看看