模板实现查找算法

使用模版实现顺序查找和对分查找,遇到的问题:

1、class和typename的区别

  • 声明模板参数时,class和typename关键字等价,可以互换;(早期的C++标准中,模版参数的关键字是通过class来标识的,后引入typename关键字。typename关键字本质上是标识一个类型,所以在模版参数定义时可以代替class。)
  • 用作“嵌套依赖类型名”,必须用typename关键字标识;(例外:继承列表/成员初始化列表中的基类初始化时,可以不用typename标识“嵌套依赖类型名”,因为编译器能够根据上下程序识别某个字符串是类类型名称。)
template <typename T>
void func(const T &container)
{
    T::const_iterator *x;
}

func函数中,变量x的类型依赖于模板参数T,它的具体类型只有在编译时,模板推导过程中才能被确定,这样的类型称为“嵌套依赖类型”(nested dependent type name)。

编译器不知道T::const_iterator是一个静态变量(做乘法),还是一个类型名(则声明变量x),故编译出错(error: ‘x‘ was not declared in this scope)。此时必须用typename显式告诉编译器T::const_iterator是一个类型。

参考:http://blog.csdn.net/swust_long/article/details/7006780

2、vector出现subscript out of range的问题

#include<iostream>
#include<string>
#include<vector>
using namespace std;

void main()
{
    vector<string> a;

    //a.resize(2);            // 1. 加这一行
    //a[0]="aaaaaa";
    //a[1]="xxxxxx";

    a.push_back("aaaaaa");    // 2. 或者这么写
    a.push_back("xxxxxx");

    cout<<a.size()<<endl;
}

直接定义a[0]、a[1]出错,因为对象a还没有分配空间,解决方法两种:

(1)使用resize分配对象a的空间;

(2)使用push_back添加元素。

模板实现查找算法(顺序查找和对分查找)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template <typename T>
bool SequentialSearchTemplate(vector<T> &array, T t)
{
    int i = 0;
    while(i<array.size() && t!= array[i])
    {
        ++i;
    }
    if (t == array[i])
    {
        return true;
    }
    else
    {
        return false;
    }
}

template <typename T>
bool BinarySearchTemplate(vector<T> &array, T t)
{
    int low = 0;
    int high = array.size()-1;
    int mid;
    while(low <= high)
    {
        mid = (low+high)/2;
        if (t < array[mid])
        {
            high = mid -1;
        }
        else if (t > array[mid])
        {
            low = mid + 1;
        }
        else
        {
            return true;
        }

    }
    return false;

}
void BinarySearchTemplateTest()
{
    vector<int> vec;
    for (int i=0; i<100; ++i)
    {
        vec.push_back(i);
    }
    bool res = SequentialSearchTemplate(vec, 29);
    cout << "search result for [29]: " <<res<<endl;
    res = SequentialSearchTemplate(vec, 16);
    cout << "search result for [16]: " <<res<<endl;

    vector<double> doubleVec;
    for (int i=0 ; i<100; i+=2)
    {
        doubleVec.push_back(i+0.3);
    }
    res = BinarySearchTemplate(doubleVec, 29.3);
    cout << "search result for [29]: " <<res<<endl;
    res = BinarySearchTemplate(doubleVec, 16.3);
    cout << "search result for [16]: " <<res<<endl; 

    ////需要重载运算符“<”,以用于string
    //vector<string> strVec;
    //strVec.push_back("world");
    //strVec.push_back("hello");
    //strVec.push_back("b");
    //strVec.push_back("world2");
    //strVec.push_back("hello2");
    //strVec.push_back("b2");
    //sort(strVec.begin(),strVec.end());

    //res = BinarySearchTemplate<string>(strVec,"a");
    //cout << "search result for [a]: "<< res<<endl;
    //res = BinarySearchTemplate<string>(strVec,"world");
    //cout << "search result for [world]: "<< res<<endl;

}

void main()
{
    BinarySearchTemplateTest();

}

时间: 2024-10-11 11:05:33

模板实现查找算法的相关文章

二分——二分查找算法模板

转自:二分查找算法模板 二分模板一共有两个,分别适用于不同情况.算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值. 版本1当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1. C++ 代码模板: int bsearch_1(int l, int r) { while (l < r) { int mid = l + r >> 1;

详解二分查找算法

我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单.看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky... 这句话可以这样理解:思路很简单,细节是魔鬼. 本文就来探究几个最常用的二分查找场景:寻找一个数.寻找左侧边界.寻找右侧

排序、查找算法

1> 插入排序 //插入排序(把第一个当作也排好序,然后对后面的依次插入到已排好序的队列中)平均时间复杂度0(n^2) public void insertSort(int[] a){ for(int i = 1;i<a.length;i++){ for(int j = i;j > 0;j--){ if(a[j] < a[j-1]){ int tmp = a[j]; a[j] = a[j-1]; a[j-1] = tmp; } } } } 2> 希尔排序 /*希尔排序:平均时

二分查找算法的 JavaScript 实现

二分查找在查找[指定值]在[有序]数据中的[位置]时是一种高效的算法. 以下仅提供 ES5 版本. var arr = [0, 2, 4, 27, 28, 54, 67, 74, 75, 79, 86, 97, 289, 290, 678] function binarySearch(arr, val) { var start = 0, end = arr.length - 1; while (start <= end) { var mid = Math.floor((start + end)

Java学习 (七)、数组,查找算法,二分查找法,冒泡排序,选择排序,插入排序

一.常用数组查找算法 工作原理:它又称为顺序查找,在一列给定的值中进行搜索,从一端的开始逐一检查每个元素,知道找到所需元素的过程. 例1:查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1 1 import java.util.Scanner; 2 public class LinearSearch{ 3 public static void main(String []argas) 4 { 5 int [] array={10,100,90,65,80,92}; 6 System.o

算法_001_二分查找算法

 二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:     1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,    2.寻找{6, 7, 8, 9}的中位数,为7,7>

Java学习之二分查找算法

好久没写算法了.只记得递归方法..结果测试下爆栈了. 思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的. 自己写的代码: 1 package com.gh; 2 3 import java.util.Arrays; 4 /** 5 * 二分查找算法实现 6 * @author ganhang 7 * 8 */ 9 public class Search { 10 public static void mai

二分查找算法java实现

今天看了一下JDK里面的二分法是实现,觉得有点小问题.二分法的实现有多种今天就给大家分享两种.一种是递归方式的,一种是非递归方式的.先来看看一些基础的东西. 1.算法概念. 二分查找算法也称为折半搜索.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法.请注意这种算法是建立在有序数组基础上的. 2.算法思想. ①搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: ②如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间

二分查找算法

提到查找算法,最经典的就是二分查找算法了.在二分查找时要在有序的数据里查找目标target,先取中间元素与target比较, 当target小于中间元素的时候,则搜索数组的前半部分,target大于中间元素时,则取数组的后半部分.重复整个搜索的过程 将左半部分与有半部分当作子数组继续查找,直到找到元素或到子数组的大小为0停止. 原理上很简单却有较多细节,尤其是数据边界的取值是否会越界,while循环的条件. java code: public class BinarySearchDemo { p