- 博客(23)
- 收藏
- 关注
原创 Item 41: 了解隐式接口和编译期多态
通常显式接口由函数的签名式(函数名称、参数类型、返回类型)构成。例如Widget class: class Widget{ public: Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize(); void swap( Widget&
2017-03-28 19:41:00
345
原创 Item 48: 认识template元编程
我们在Item 47留下了一个问题,现在再来看一看:template<typename IterT, typename DistT>void advance( IterT& iter, DistT d ){ if( typeid(typename std::iterator_traits<IterT>::iterator_category) == typeid(std::rando
2017-03-28 19:29:45
344
原创 Item 47: 请使用traits class表现类型信息
为了说明traits class的作用,这一节用迭代器做了一个例子。 STL有五种迭代器: (1)Input迭代器只能向前移动,且一次一步,客户只可读取它们所指的东西,而且只能读一次;这一类代表是istream_iterator。 (2)Output迭代器跟Input相似,但是客户只可涂写它们所指的东西,而且只能写一次;这一类代表是ostream_iterator。 (3)Forwa
2017-03-28 19:27:33
449
原创 Item 46: 需要类型转换时请为模板定义非成员函数
我们在Item 24提到过用将Rational的operator*声明为non-member,从而使2*oneHalf得以成功调用该函数。这是在没有template的情况下。Rational和operator*被模板化后会怎样呢?template<typename T>clas Rational{ public: Rational( const T& numerator=0, cons
2017-03-28 19:19:43
266
原创 Item 24: 若所有参数皆需要类型转换,请为此采用non-member函数
这里的non-member函数对应的另一个函数是member函数,member函数暗含着一个this参数,所谓的“若所有参数比需要类型转换,必须采用non-member函数”的原因就在于,member函数暗含的*this参数是转换不了的!例如我们前面提到的operator应用于Rational,假如operator*是Rational的一个member函数:class Rational{ pub
2017-03-28 19:11:59
403
原创 Item 45: 利用成员函数模板接受所有兼容类型(智能指针的部分实现)
真实指针做得很好的一件事是,它支持隐式转换,如下: class Top { ... }; class Middle: public Top{ ... }; class Bottom: public Middle { ... }; Top* pt1 = new Middle; //将Middle*转换为Top* Middle* pt2 = new Bot
2017-03-28 19:05:48
307
原创 Item 43: 学习处理模板化基类内的名称
模板都会编译两次,第一次检查语法,第二次具现化。假如模板有不同参数,则会对每个参数都具现一次。如果参数不确定,则不可能具现,也就不知道它的行为。 一个类模板继承于另一个相同模板参数的基类,派生类使用到基类的成员时,编译器往往会报错该成员未定义。因为在第一次编译的语法检查中,即使知道Derived继承自Base,但其中的T是个template参数,不到Derived被具现化无法确切知道它是什么,而
2017-03-28 18:59:39
318
原创 Item 44:将与参数无关的代码抽离templates
template为每一个模板参数生成一份代码,可能会造成代码膨胀。模板参数分为类型参数和非类型参数,通常非类型参数比较容易造成代码膨胀,例如下面一个例子:template<typename T, std::size_t n>class SquareMatrix{ public: ... void invert(); //求逆矩阵};SquareMatrix<dou
2017-03-28 18:57:47
272
原创 顺时针打印矩阵
简单说一下思路:打印总共可分为四部,从左往右,从上到下,从右往左,从下到上。执行完这四步后,相当于对原矩阵剥了一层皮,可看成一个新的待打印矩阵。然后重复执行上述四步
2017-03-17 17:54:58
238
转载 Gaussian Mixture Model(GMM)
事实上,GMM 和 k-means 很像,不过 GMM 是学习出一些概率密度函数来(所以 GMM 除了用在 clustering 上之外,还经常被用于 density estimation ),简单地说,k-means 的结果是每个数据点被 assign 到其中某一个 cluster 了,而 GMM 则给出这些数据点被 assign 到每个 cluster 的概率,又称作 soft assignme
2016-11-12 10:41:51
349
原创 c++强制类型转换
强制转换运算符有几种特定于 C++ 语言的转换运算符。这些运算符用于删除旧式 C 语言转换中的一些多义性和危险继承。这些运算符是:dynamic_cast 用于多态类型的转换。static_cast 用于非多态类型的转换。const_cast 用于删除 const、volatile 和 __unaligned 特性。reinterpret_cast 用于位的简单重新解释。
2016-09-04 09:47:38
345
原创 Ubuntu15.10 Hadoop伪分布式环境安装
因为课程实验的需要,需要搭建hadoop伪分布式环境,经过了一天的探索,终于成功搭建好了,并整理成文。
2016-05-25 11:07:39
767
原创 essential c++ 练习题(2)
早上起来写了课后习题3.3,进一步熟悉了解map、vector等容器的一些用法。在这道题中需要注意的是,因为题目的需要,将map的value设置为vector < string >。代码部分都有详细注释,应该能看懂
2016-05-15 12:54:18
576
原创 essential c++ 练习题(1)
今天终于把第三章“泛型编程的风格”给看完了,趁着知识点还热乎,做了下课后的习题3.1和3.2,由于这两道题基本类似,所以代码把代码也写到一起去了。/*
2016-05-14 21:55:51
877
原创 c++引用深入分析
序几天前写过关于引用和指针的区别,当时心里就有一个疑惑,既然都说引用是对象的一个别名,那引用变量到底有没有被分配存储空间。我去Google了一下,发现网上有两种截然不同的看法,一种说是在栈里分配了空间,另一种则是说没有分配空间,仅仅是别名而已。经过几天的看书以及思考,我又有了新的体会,特写此篇。同时也感谢博文《c++引用深入探讨》给我的灵感 http://www.cnblogs.com/winte
2016-03-30 00:40:15
292
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人