- 博客(25)
- 收藏
- 关注
原创 递归模板模式的使用: 统计某类对象的个数
一、概念引入什么叫递归模板模式呢?简单的来说就是:派生类将本身作为模板参数传递给基类//传递派生类类型template class CuriousBase {....};template class CuriousTemplate : public CuriousBaseCuriousTemplate >{....};//传递派生
2017-01-24 16:29:18 360
原创 模板的应用: 判断类型选择合适的传参方式 以提高效率
一、需求引入我们都知道,对于一个很大的数据结构而言,采用传值的方式通常是很耗费资源的,因此对于这种数据结构,应该“传const 引用”(或者在C中传递const指针);相反,对于更小的数据结构,情况并非这么简单:通常依赖于实际的代码体系结构,总的来说小的数据结构究竟采取何种传递方式,对性能影响并不大,但是也必须小心处理二、实现方式面对 templates,事情变得更为棘手。
2017-01-23 11:34:17 461
原创 模板的使用:Promotion Traits( 类型提升之特征萃取)
一、需求引入让我们先来看一个函数模板template Array operator+ (Array const&, Array const&); 这很好,但由于语言允许我们将一个 char 和一个 int 相加,我们十分希望诸如此类的混合操作 也能实施于 arrays 身上。这么一来我们就必须决定新版本的回返类型(return type)应该是什么: tem
2017-01-22 17:33:44 400
原创 模板的使用:如何判断参数是否为一个类
一、需求引入如果给你一个变量,该如何判断是一个普通变量还是一个类变量呢?二、模板实现template class IsClassT { private: typedef char One; typedef struct { char a[2]; } Two; //如果C是类变量,调用这个template static One test(i
2017-01-22 11:33:41 1555 1
原创 模板:用双重模板参数实现 简单的 policy 类
一、需求引入前一篇博客说明了用普通类来实现policy的接口,接下来让我们用模板类来实现policy的接口二、实现第一种实现方式:policy是一个模板类: 类型模板类template class AccumulationTraits; templateclass AccumulationTraits { public:
2017-01-21 16:22:04 413
原创 模板:policy类的简单使用
一、需求引入到目前为止,我们一直都将累计(accumulation)与求和(summation)混为一谈。显然我们其实可以设想其它种类的累计。例如我们可以求给定之实值序列的乘积;如果被操作的实值是字串,我们可以将它们串接起来;甚至「寻找序列中的最大值」也可被归结为累计问题。在所有情况中,accum()惟一需要修改的就是 total += *beg。这个操作可被称为「累计运算」过程中的一个
2017-01-21 15:00:32 700
原创 模板:参数化 trait 的 使用方法
一、需求引入根据前一篇博客,我们已经知道了fixed trait的使用方法,因为一旦定义trait 完毕,你就不可以在算法中覆写(overridden)它。不过某些情况下 这样的覆写可能是我们想要的,例如当我们碰巧知道某一套浮点数可被安全地累计放进一个同 型的(浮点数)变量中,「覆写 traits」就有可能使我们的开发更高效。 原则上,解决方案是这样:添加一个带有默认值的
2017-01-20 18:56:36 377
原创 模板:fixed trait类的简单使用
以下是一个用于求和的accum 模板,自动根据参数的类型求某段区间内元素值的总和template class AccumulationTraits; templateclass AccumulationTraits { public: typedef int AccT; static AccT zero() { return 0; } };
2017-01-20 16:04:08 265
原创 模板实现的静多态
一、概念引入动多态:根据继承和虚函数实现的多态,这里不过多介绍静多态:通过模板技术实现的多态,在编译期决定特点:具有隐式的公共性,必须支持某些使用公共的语法操作(也就是说,相关的函数必须具有相同的名称),另外具体类之间的定义是相互独立的二、举例// 具象的几何类别 Circle // - 不衍生自任何类别 class Circle { public:
2017-01-16 18:29:57 333
原创 基于模板、全局特化、局部特化实现的链表
下面代码仅仅作为例子:#include #include#includeusing namespace std;//主模板template class List { public: void append(T const& elemt){ vt.push_back(elemt);
2017-01-16 16:29:31 271
转载 friso开源库介绍
官方网站:https://code.google.com/p/friso/最新动态:friso-1.6.0发布了(2014.05.08 最新版本)开源,简单易用,很适合分词技术的研究。 一。friso中文分词器Friso是使用C语言开发的一款高性能中文分词器,使用流行的mmseg算法实现。完全基于模块化设计和实现,可以很方便的植入到其他程序中,例如:MySQL,PHP等。同
2017-01-11 17:19:55 956
转载 MMSEG分词算法
最近看了下MMSEG分词算法,觉得这个算法简单高效,而且还非常准确 作者声称这个规则达到了99.69%的准确率并且93.21%的歧义能被这个规则消除。核心思想是抽取3个可能的词(存在多个组合),然后根据4个消歧义规则确定到底选择那个组合 1. 组合长度最大 2. 组合中平均词语长度最大 3. 词语长度的变化率最小 4. 计算组合中所有单字词词频的自然对数,然后将得到的值相加,
2017-01-11 17:14:43 264
原创 模板类型实参和非类型实参的使用 ----- 基于模板的函数指针的使用
我们都会使用c的函数指针的调用函数,那么基于模板该如何实现呢?下面仅仅是个小的实现方式,仅供参考#include #includeusing namespace std; template class C{ public:void fun(int N){nontype_param(N);} }; void fun(int N){
2017-01-09 10:43:25 262
原创 类模板最常见的链接错误
一、问题引入大多数 C/C++ 程序员大致上都按照以下方式来组织他们的 non-template 程序代码: Classes 和其它类型被全体放置于头文件(header files)。通常头文件的后缀名称(扩展名) 为.hpp(或 .H, .h, .hh, .hxx 等等)。 全局变量和 non-inline 函数只在头文件中置入声明语句, 定义式则置于
2017-01-04 16:48:23 1342
原创 类模板零值初始化
一、需求引入对于基本类型如 int、double、pointer type(指针类型)来说,并没有一个 default 构造函数将它 们初始化为有意义的值。任何一个未初始化的区域变量(local variable),其值都是未定义的: void foo() { int x; // x 的值未有定义 int* ptr; // ptr 指向某处(而不是哪儿都不指向)
2017-01-04 16:06:14 691
原创 Template Template Parameters(双重模板参数)
一、需求引入 一个 template parameter 本身也可以是个 class template , 这一点非常有用 。 我们将再次以 stack class template 说明这种用法。 为了使用其它类型的元素容器 , stack class 使用者必须两次指定元素类型: 一次是元素类型本身,另一次是容器类型: Stackint,std::vectorint>
2017-01-04 15:39:04 2615 2
原创 Member Templates(成 员模板 )
一、问题引入在前面博客提到的stacks模板类,通常只有当两个 stacks 类型相同,也就是当两个stacks 拥有相同类型的元素时,你才能对它们相互赋值(assign),也就是将某个 stack 整体赋值给另一个。你不能把某种类型的 stack赋值给另一种类型的 stack,即使这两种类型之间可以隐式转型: Stack intStack1, intStack2; // s
2017-01-04 12:00:01 333
原创 模板 关键词 typename
一、引入关键词typename 是C++标准化过程中被引入的,目的在于向编译器说明template 内的某个标识符是个类型(而不是其它什么东西)。考虑下面的例子: template class MyClass { typename T::SubType * ptr; ... }; 在这里,第一个typename可以换成class, 第二个 typenam
2017-01-04 10:48:27 251
原创 非类型函数模板参数
一、引入你也可以为 function template 定义 nontype parameters。例如下面的 function template 定义了一组 函数,可以将参数 x 累加一个值(VAL)后传回: template T addValue(T const& x) { return x + VAL; } 当我们需要把「函数」或「某种通
2017-01-04 10:22:03 646
原创 Nontype Class Template Parameters(非类型类模板参数)
一、需求引入上一篇博客实作了一个「元素个数可变」的stack class。与之对比,你也可以实作另一种stack,透过一个固定大小(fixed-size)的 array来容纳元素。这样做的好处是不必考虑诸如内存管理之类的问题。然而array大小的决定是一件比较困难的事:array愈小则stack愈容易满溢,array愈大则愈容易造成空间浪费 。 一个可行的解决办法是让使用者指定array大
2017-01-03 18:33:34 305
原创 预设模板自变量
一、预设模板自变量的示例代码你可以针对 class templates 定义其 template parameters 的默认值 , 这称为 default template arguments (预设模板自变量)。预设自变量值甚至可以引用前一步声明的 template parameters。例如在前面博客中提到的class Stack 作为其默认值: #include
2017-01-03 17:28:06 425
原创 类模板的偏特化
Class templates 可以被偏特化(partial specialized,或称部份特化、局部特化)。这使你得以在特定情形下使用特殊实作码,但仍然留给你(使用者)选择 template parameters 的能力。例如对于下面的 class template: template class MyClass { ... }; 以下数种形式的偏特化
2017-01-03 16:49:23 631
原创 类模板特化
一、主模板#include #include template class Stack { private: // 元素std::vector elems; public: // push 元素void push(T const&);// pop 元素 void pop(); // 传回最顶端元素 T top()
2017-01-03 16:31:03 354
原创 重载 函数模板
就像常规(意即non-template)functions一样,function templates 也可以被重载 // 传回两个 ints 中的较大者 inline int const& max (int const& a, int const& b) { return a } // 传回两任意类型的数值中的较大者 template inlin
2017-01-03 14:59:17 403
原创 模板参数 自变量推导
一、基本概念Function templates 有两种参数: 1. Template parameters(模板参数),在function template 名称前的一对角(尖)括号中声明: template // T 是个 template parameter 2. Call parameters(调用参数),在 function temp
2017-01-03 11:46:43 555
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人