• 模板实现查找算法


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

    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
  • 相关阅读:
    AgilePoint模型驱动BPM(业务流程管理)介绍
    WF从入门到精通(第五章):workflow跟踪 (转)
    昕友.亿达PM项目管理软件 结构草图
    C++之虚拟继承
    Using Batch Parameters
    Static 关键字 C and C++
    something about code coverage planning
    C++ 虚函数表
    C++ FAQ for me
    Drag and Drop in WPF
  • 原文地址:https://www.cnblogs.com/pukaifei/p/5136952.html
Copyright © 2020-2023  润新知