[2018年6月7号]C++ primer 课后练习 第十六章 模版与泛型编程

16.62
namespace std{
    template<>
    class hash<Sales_data>{
        typedef size_t result_type;
        typedef Sales_data argument_type;
        size_t operator()(const Sales_data & )const;
    };
    size_t hash<Sales_data>::operator()(const Sales_data & s)const{
        return hash<string>()(s.bookNo)^hash<int>()(s.units_sold)^hash<double>()(s.revenue);
    }
}

16.63

template<typename T>
size_t countInVec(vector<T> vec, const T & key){
    return count(vec.cbegin(),vec.cend(),key);
}

int main() {
    vector<int> vecI = {1,2,3,4,5,5,5,5,5};
    vector<double> vecD = { 1.7,2.6,3.3,4.1,5.2,5.3,5.4,5.5,5.5 };;
    cout << countInVec(vecI, 5) << endl;
    cout << countInVec(vecD, 5.5) << endl;
    for (;;);
    return 0;
}

16.64

template<typename T>
size_t countInVec(vector<T> vec, const T & key){
    return count(vec.cbegin(), vec.cend(), key);
}
template<>
size_t countInVec(vector<const char *> vec, const char* const & key){
    size_t count = 0;
    for(vector<const char *>::const_iterator it = vec.cbegin(); it != vec.cend(); ++it){
        if(strcmp((*it),key) == 0){
            count++;
        }
    }
    return count;
}


int main() {
    vector<int> vecI = {1,2,3,4,5,5,5,5,5};
    vector<double> vecD = { 1.7,2.6,3.3,4.1,5.2,5.3,5.4,5.5,5.5 };
    vector<const char *> vecC = { "1","3","4"};
    cout << countInVec(vecI, 5) << endl;
    cout << countInVec(vecD, 5.5) << endl;
    const char * c = "soo";
    cout << countInVec(vecC, c) << endl;
    for (;;);
    return 0;
}

16.65

template<>
string debug_rep(char * const& p){
    return debug_rep(string(p));
}
template<>
string debug_rep(const char*const& p) {
    return debug_rep(string(p));
}

16.66

定义函数模版的特例化版本时,我们本质上接管了编译器的工作,即,我们为原模版的一个特殊实例提供了定义,重要的是要弄清:一个特例化版本本质上是一个实例,而非函数名的一个重载版本,不会影响函数匹配

优点:特例化只是一个实例,并不是重载函数,所以会减少重载函数的资源消耗

缺点:当有函数重载时,优先级会比重载函数低

16.67

定义函数模版的特例化版本时,我们本质上接管了编译器的工作,即,我们为原模版的一个特殊实例提供了定义,重要的是要弄清:一个特例化版本本质上是一个实例,而非函数名的一个重载版本,不会影响函数匹配



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值