C++面向对象程序设计-Seventh Week

(1)面向对象编程(OOP)与泛型编程(GP)之间的区别:

OOP试图将datas与methods关联在一起,为此在OOP中,将数据与操作放置在同一个类中,同时设定了类之间的继承关系。

GP则是将datas与methods分离。例如sort没有被定义为类内的成员函数,而是将其归入STL的算法中,作为一个全局函数存在。算法和容器之间利用迭代器进行关联。

采用GP编码:

<1>Containers和Algorithms彼此之间不存在交叉,两者可以单独进行开发,只需要利用Iterator进行沟通即可。

<2>Algorithms可以通过Iterators确定其操作范围,并且可以通过Iterators取用Container中的元素。

在上述例子中,可以看出两个max函数一个使用了编译器自带的<操作,而另一个使用仿函数comp自定义比较规则。对于所有Algorithms,其中最终涉及元素本身的操作,无非就是比较大小。由于上述函数利用了模板,因此应当注意所传入的类型T应当能够支持进行相对应的比较操作,否则则需要对比较操作运算符进行重载。

对于操作符重载应该注意:并不是所有的操作符都能够被重载。重载之后的操作符函数可以被作为一个全局函数,也可以被作为一个成员函数。

(2)模板

<1>类模板:注意其关键字template。其中的T类型不确定,在模板被使用时确定其具体类型。

<2>函数模板:其关键字template。在使用时,编译器会对函数模板进行实参推导,确定模板中T的具体类型。

<3>成员模板

(3)模板的特化

特化可以被分为全特化与偏特化。

<1>一个被泛化的模板为:

template

struct A{…..}

经过全特化后为:

template<>struct A{…..}

template<>struct A{…..}

<2>偏特化也被称为局部特化。

template

class vector{......};

实施偏特化后:

template

class vector{......};

上述偏特化为个数的偏特化。

template

struct A{…..};

能够接受任意类型的type。将其进行范围的偏特化,使其只能够接受固定类型的type。

template

struct A{…..};

template

struct A{…..};

(4)分配器allocators

分配器所分配内存是使用operator new()和malloc()函数完成容器所需要的内存的分配。

通过上图可以看出,通过分配器所分配的内存比实际所需要的内存数量要大,其中包括cookie等额外所分配的控件。所需要分配的控件越小,则其所额外分配的内存在总体内存中所占用的比例越大。本周课堂上所比较的几种编译器只是以::operator new和::operator delete完成allocate()和deallocate(),没有任何特殊的设计.。

可以利用allocator()完成临时对象的创建。

int* p = allocator().allocate(512,(int*)0);

其中必须指定所分配的内存的大小。同时在进行内存释放时:

allocator().deallocate(p,512);

释放内存时必须同时给出所分配的内存数目。

在G4.9所附带的标准库中,有许多extention allocators(附加类型的分配器)。

其中__pool_alloc就是G2.9中的alloc。

(5)List

list容器是一种双向的链表,因此其节点除了存放数据之外,还存在一个向前的指针和一个向后的指针。

template

struct __list_node{

typedef void* void_pointer;

void_pointer    prev;

void_pointer     next;

T  data;

}

由此可知list容器的迭代器的结构如下:

template

struct __list_iterator{

typedef   T  value_type;

typedef   Ptr  pointer;

typedef  Ref  reference;

……

}

除了vector和array之外。其余容器的迭代器都应当是一个class,也就是一个智能指针。

迭代器的++++和----操作:

前++为:

self& operator++()

{

node= (link_type)((*node).next);

return *this;

}

后++为:

self operator++(int)

{

self tmp = *this;     //记录原值

++*this;                  //进行操作

return tmp;//返回原值

}

本次编程作业中要求打印中间元素:

Index = (ListData.size()) / 2;

for(iList = ListData.begin(); iList != ListData.end();++++iList)

{

----Index;

if(Index == 0)

{

cout<< "中间元素为:" << *iList << endl ;

break;

}

}

使用++++能够得到正确的节点值,而++得到的是正确节点的前一个节点值。

(6)Traits

iterator需要遵循的原则

std::rotate(__first,__middle,__last,std::iterator_category(__first));

在上例中,rotate()需要知道iterators的三个associated types。

iterators必须有能力回答algorithms的提问。这样的提问在C++标准库开发过程中设计了五种:category:种类;difference_type;距离;value_type:值类型;reference;pointer。

如果iterator不是一个class,也就是说此时iterator是一个原生指针,这时的iterator被称为退化的。

Iterator Traits用以分离class iterators和non—class iterators。

(7)容器vector

Vector容器的容积以二倍增长的形式增长。

Vector容器的迭代器就是一个原生指针。

(8)容器array

Array在C++11后,被添加至容器中。定义一个array必须指定其长度,一旦定义,array无法自动变更容积。

(9)forward_list容器

作者:游在路上的鱼

链接:http://www.jianshu.com/p/2ad200d9a018

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容