仿函数和模版的模板参数

之后我在整理之后会把类型萃取也放着这个文章里面,我自己还是满容易混淆的,经常分不清、

模版的模板参数主要使用在类的类成员也是个模板类,当你想只输入一个模板参数,就可以同时对类内的其他类成员传入相同的模板参数的时候就可以使用咯

 1 #include<iostream>
 2
 3 using namespace std;
 4
 5
 6
 7 template<class T>
 8 class class1
 9 {
10                  T a;
11 };
12
13 template < class T, template< class> class class1 >
14 class class2
15 {
16                  T b;
17                  class1<T> c;
18 };

这个就是模板的模版参数的一个简单实现,用来实现类的类成员和该类模板使用类型一致的方法

那什么是仿函数呢,仿函数是STL库中经常使用的一种手法

仿函数可以通过结构体内部定义一些operator()实现一种类似函数的方法,通过模板传参就可以使用,仿函数并不是真正的函数,是通过模板和结构体(或者是类)实现的,类似函数的体制,仿函数可以用在代码的重用上,可以减少冗余的部分代码,例如可以将比较大小整合成一个仿函数,在使用的时候就可以省去很多代码

 1 template<class K>
 2 struct HashFuncer
 3 {
 4     size_t operator()(const K& key,size_t capacity)
 5     {
 6         return key%capacity;
 7     }
 8 };
 9
10 template<>
11 struct HashFuncer<string>
12 {
13     static size_t BKDRHash(const char *s)
14     {
15         unsigned int seed = 131;
16         unsigned hash = 0;
17         while (*s)
18         {
19             hash = hash*seed + (*s++);
20
21         }
22         return (hash & 0x7FFFFFFF);//八成是想取个正数
23     }
24     size_t operator()(const string &key, size_t _capacity)
25     {
26         return BKDRHash(key.c_str())%_capacity;
27     }
28 };
29
30
31
32
33
34 template<class K,class V,class HashFun=HashFuncer<K>>
35 class HashTable
36 {
37 };

这里贴出我写的哈希表的部分代码,这里就是用了仿函数,目的是处理不同的结构,当哈希表存入的是int类型,和当哈希表存入的是string类型时,调用的仿函数是不同的(我对仿函数的模板进行了特化),下边贴一下调用仿函数的代码

1 size_t HashFuner(const K& key,size_t capacity)

2 {

3   return HashFun()(key, capacity);

4 }

因为HashFun是一个结构体,所以构造一个匿名变量调用operator()方法,再进行封装

这样看起来就跟函数差不多了,不是么

时间: 2024-08-28 18:02:00

仿函数和模版的模板参数的相关文章

STL源码分析--仿函数 &amp; 模板的模板参数 &amp; 临时对象

STL源码分析-使用的一些特殊语法 关于泛型编程中用到的一些特殊语法,这些语法也适用于平常的模板编程 1.  类模板中使用静态成员变量 Static成员变量在类模板中并不是很特殊,同时这个变量不属于对象,属于实例化以后的这个类类型.每一个实例化对应一个static变量 2.  类模板中可以再有模板成员 3.  模板参数可以根据前一个模板参数而设定默认值 4.  类模板可以拥有非类型的模板参数 所谓非类型的模板参数就是内建型的模板参数 Template <class T,class Alloc =

读书笔记 effective c++ Item 44 将与模板参数无关的代码抽离出来

1. 使用模板可能导致代码膨胀 使用模板是节省时间和避免代码重用的很好的方法.你不需要手动输入20个相同的类名,每个类有15个成员函数,相反,你只需要输入一个类模板,然后让编译器来为你实例化20个特定的类和300个你需要的函数.(只有在被使用的情况下类模版的成员函数才会被隐式的实例化,所以只有在300个函数被实际用到的情况下才会生成300个成员函数.)函数模板同样吸引人.你不用手动实现许多函数,你只需要实现一个函数模板,然后让编译器来做余下的事情. 然而在有些时候,如果你不小心,使用模板会导致代

C++模板之可变模板参数

可变模板参数---- C++11新特性 可变模板参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数 由于可变模版参数比较抽象,使用起来需要一定的技巧,所以它也是C++11中最难理解和掌握的特性之一 参数包(parameter pack) 模板参数包,如: template<typename- Args>class tuple; Args标识符的左侧使用了省略号,在C++11中Args被称为"模板

c++ 模板参数做容器参数,迭代器报错 vector&lt;T&gt;::const_iterator

错误如下: template<class T>void temp(std::vector<T>& container){        std::vector<T>::const_iterator p; //error: expected ‘;’ before ‘p’        for(p = container.begin(); p != container.end(); ++p)        {                //...       

模板系列(一) 模板的模板参数

前面我们写过类似的Stack: template <typename T, typename Alloc = std::vector<T> > class Stack { public: void push(const T &); void pop(); T top() const; bool empty() const; private: Alloc _cont; }; 那么我们使用的时候需要这样: Stack<string, list<string>

STL的map容器将第3个模板参数设为less_equal或greater_equal会怎样?

最近都在学Linux系统编程,用C就足矣,有段时间没碰C++了,于是实现些算法练手. 实现多项式乘法的时候发现有几项没有合并同类项,最终调试到这一步时发现了问题. res是map类型,用find查找key为1991的key-value时,结果得到的却是<12,1>的key-value. 于是转去看那段代码,发现了问题.因为map默认是升序排列,我最后需要打印的多项式是按照幂次数(即这里res的key)降序排列,所以我需要设置map的第3个模板参数,但是由于代码补全我没确认就选择了. map&l

模板参数tag的用法

//通过结构体/类的类型来作为模板参数的tag, //用来区分tag之间的区别. //made by davidsu33 //例如对于某个全局的静态变量,你如果希望有 //很多份,但是其实现又是一样的,你可以考虑 //以模板的形式,通过类tag来区分 //而且还可以根据实际需要来特化模板 #include "stdafx.h" #include <iostream> #include <cassert> using namespace std; template

模板系列(一)模板的模板参数

在之前,我们写过类似的stack template <typename T, typename Alloc = std::vector<T> > class Stack { public: void push(const T &); void pop(); T top() const; bool empty() const; private: Alloc cont_; }; 那么我们使用的时候,需要这样写 Stack<string, list<string>

最小生成树(kruskal模版 Prim模板)

http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2144&cid=1186 最小生成树,最重要的是了解思想 稠密图用Prim,稀疏图用Kruskal K(每次找最小的边连接,一条边连接两个点,所以单路就可以了) 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 int bin[110]; 5 struct node 6 { 7 int