homework-07

http://www.cnblogs.com/zhuyp1015/archive/2012/08/02/2620767.html

由于我的英文能力不是很强,再加上这种专业方面的词汇更是读不懂了,因此我选择了4篇中文博客。

首先我看的第一篇是有关c++的array的,是一种固定大小的容器。

我学习的第一种编程语言是pascal,其中数组定义为a:array[1..1000]of longint;让我冒然认为c++中的array就是数组,但其实...似乎就是实现数组的功能啊!

文中提到了fill、data、swap3个函数。

1. fill函数:

  其用途是将array中的全部元素置为某个值。但是细想想,在我以往的编程习惯中,我习惯#include<cstring>然后再memset(a,0,sizeof(a))。似乎也是一条语句达到目的。但是有些时候,貌似这样赋值是不行的,具体为什么我也不清楚...于是只好写for循环赋值。

2. data函数:

  其用途是返回数组中第一个元素的指针。我比较害怕指针,因为一旦用错就会出现程序崩溃,还不容易查错。能不用我就尽量不用了...

3. swap函数:

  其用途是将两个数组中的元素交换,语句为first.swap(second);不过其要求比较严格,必须为相同类型,相同长度。这个函数比较实用,在我以往的习惯中,交换数组中元素需要另外声明一个变量,进行交换。用swap函数可以省下这一声明。

  但是,其局限性在于必须为同等大小。

http://www.cnblogs.com/zhuyp1015/archive/2012/08/10/2633065.html

既然刚才说到了自己对于指针用法的不熟练,于是也应该补补短。

我选择了一篇讲解c++的shared_ptr的文章。其作用有如同指针,但会记录有多少个shared_ptrs共同指向一个对象,就是引用次数。

其优点在于,我的理解是,当一个shared_ptrs的地址被赋值给另一个时,既其完成了使用周期,这个指针就没用了,按照往常经验我们需要另加free语句来释放内存,否则长时间积累会造成内存溢出。而shared_ptrs的自动删除功能恰好解决了这一问题。

同时,shared_ptrs还拥有较多的函数,例如unique函数——判断该指针的引用计数是否为1,use_count()函数——返回该指针的引用计数,get()函数——返回该指针的值,reset()函数——清除该指针的引用计数,swap()函数——交换两个指针的值。

使得shared_ptrs可以完美的融入c++,使其使用效率更高。

http://blog.csdn.net/srzhz/article/details/7934483

在此篇csdn的博客中提到了c++的两个新特性,自动类型推断和类型获取。

乍一看似乎二者表示的意思相同,差不多就是节省了int、double等声明变量类型的东西,用auto代替,这是自动类型推断。

如:auto x = 1;程序自动获知x的类型为int,似乎也没方便多少。

但如果要用到vector时,vector<int>::iterator itr = vec.iterator();就可以轻松被改写为auto itr = vec.iterator();

以及,在实例中进行的某个操作,引入了泛式编程,若声明变量类型不同,导致操作返回的类型也不同,因此我们这里就得引入两个泛型。

但是若采用自动类型推断来获取变量类型的话,可以轻松省去一个泛型。

不光如此,自动类型推断还可简化函数返回类型,如:auto temp(int a, double b) -> int;

既然编译器能够推断一个变量的类型,那么我们在代码中就应该能获得一个变量的类型信息,这就是类型获取。

由于在进行泛式编程的时候,会引入多个泛型,使用类型获取即可简化代码。

一般地,在大多数情况下,我们很可能无法记住n多个变量的类型,通过类型获取功能可以轻松获取变量的类型。

http://blog.csdn.net/wywty/article/details/14222683

在第三篇博客的末尾写着Lambda函数,点开后发现其为自动类型判断和类型获取的延伸。

这个函数是c++的匿名函数服务实现的条件。

为了读懂这个我特地查了一下匿名函数的定义:

匿名函数不以文件形式驻留在文件夹上;他的生成方式最简捷,可在指令窗或任何函数体内通过指令直接生成。(百度百科)

似乎还是不太理解...

例如:auto func = [] () { cout << "Hello world"; };

其中[]表示接下来开始定义Lambda函数,中括号中间有可能还会填参数。之后的()填写的是Lambda函数的参数列表,{}中间就是函数体了。

正常情况下,只要函数体中所有return都是同一个类型的话,编译器就会自行判断函数的返回类型。也可以显示地指定Lambda函数的返回类型。

Lambda函数的形式为:[captures] (params) -> ret {Statments;}

具体例子:

设计一个地址簿的类,提供函数查询地址簿,可能根据姓名查询,可能根据地址查询,还有可能两者结合。可以使用Lambda函数提供一个接口,能方便地让用户自定义自己的查询方式。

 

问题1:c++中的array中的swap函数如何对长度不同的数组进行交换?

问题2:c++该如何判断此指针需要删除? 若我们只是暂时不需要它,之后还需要用其标识符进行运算,那么还需要重复声明一次么?

问题3:auto的类型是否会随着赋值的改变而改变? 比如开始为auto a = 1;后来重新赋值a = 1.0;则此时a的类型为int还是float还是double?

问题4:获取类型信息同时存在上述问题。

问题5:lambda函数如何区分传进来的参数类型(如果参数是用auto定义的)? 若return不是同一个类型,那么返回什么类型?

问题6:总的来说,c++的新特性是方便了面向对象的哪些方面? 如何做到代码更加简洁&易读?

感想:

原来自己对于c++的了解竟然是如此之少...做ACM题时教练总是说要用.cpp文件因为速度更快,读入与输出更是不能用cin&cout。

对于c++面向对象的部分了解并不多,因为面向对象的程序我大多数在c#下开发。

在最后一篇博客的末尾写到了Lambda函数与STL。作为c++的标准模板库,其中涵盖了许多算法和组件,在引入了Lambda函数后,STL的使用将会更加方便。

我将继续阅读和学习博主写的有关Lambda函数和STL的关联的博客。

posted @ 2013-11-10 23:16  yiming.zou  阅读(177)  评论(0编辑  收藏  举报