Boolan网——C++微专业第七周学习笔记

(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<typename T>。其中的T类型不确定,在模板被使用时确定其具体类型。

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

<3>成员模板

(3)模板的特化

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

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

template<class type>

struct A{…..}

经过全特化后为:

template<>struct A<int>{…..}

template<>struct A<double>{…..}

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

template<class T,class Alloc = alloc>

class vector{......};

实施偏特化后:

template<class Alloc>

class vector<bool ,Alloc>{......};

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

template<class  type>

struct A{…..};

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

template<class T>

struct A<T*>{…..};

template<class T>

struct A<const T*>{…..};

(4)分配器allocators

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

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

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

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

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

allocator<int>().deallocate(p,512);

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

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

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

(5)List

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

template<class T>

struct __list_node{

    typedef void* void_pointer;

    void_pointer    prev;

   void_pointer     next;

   T  data;

}

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

template<class T, class Ref, class Ptr>

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容器

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

推荐阅读更多精彩内容