模板实现查找算法

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

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

}
View Code
原文地址:https://www.cnblogs.com/pukaifei/p/5136952.html