Accelerated C++:通过示例进行编程实践——练习解答(第11章)

我的Github地址:https://github.com/lanbeilyj/Accerlerated-C-plus-plus

11-0. Compile, execute, and test the programs in this chapter.

Ans:见Github。

11-1. The Student_info structure that we defined in Chapter 9 did not define a copy constructor, assignment operator, or destructor. Why not?

Ans:因为在编写类时,如果没有显示地定义复制构造函数、赋值运算符、析构函数,那么编译器就会自动为类生成相应的默认版本函数,从而进行一些默认的操作。对Student_info类的数据成员复制,该类会利用string和vector类的复制构造函数来分别复制name和homework成员;对另外两个double类型的变量成员midterm和fin则进行直接的复制。

11-2. That structure did define a default constructor. Why?

Ans:只有没有定义任何构造函数编译器才会自动生成一个不带任何参数的构造函数,而如果定义了任何一个构造函数,那么编译器就不会自动生成默认的构造函数。

11-3. What does the synthesized assignment operator for Student_info objects do?

Ans:赋值是先在定义一个变量并初始化后,调用了“=”才被调用;因此赋值会先删除原内存单元的值,然后在赋予其新的值。Student_info对象在调用自动生成的操作函数具体的操作有:自动调用string和vector的复制构造函数对name和homework进行赋值;直接对两个double变量midterm和fin进行赋值;

11-4. How many members does the synthesized Student_info destructor destroy?

Ans:见Github。

11-5. Instrument the Student_info class to count how often objects are created, copied, assigned, and destroyed. Use this instrumented class to execute the student record programs from Chapter 6. Using the instrumentedStudent_info class will let you see how many copies the library algorithms are doing. Comparing the number of copies will let you estimate what proportion of the cost differences we saw are accounted for by the use of each library class. Do this instrumentation and analysis.

Ans:具体见Github。

struct Student_info
{
    std::string name;
    double midterm,fin;
    std::vector<double> homework;

    Student_info()
    {
        std::cout<<"construct"<<std::endl;
    }
    Student_info(const Student_info& s)
    {
        copy(s);
        std::cout<<"copy"<<std::endl;
    }
    void copy(const Student_info& s)
    {
        name=s.name;
        midterm=s.midterm;
        fin=s.fin;
        homework=s.homework;
    }
    Student_info& operator=(const Student_info& s)
    {
        std::cout<<"assign"<<std::endl;
        if(&s!=this)
            copy(s);
        return *this;
    }
    ~Student_info()
    {
        std::cout<<"del"<<std::endl;
    }
};

11-6. Add an operation to remove an element from a Vec and another to empty the entireVec. These should behave analogously to theerase andclear operations onvectors.

Ans:具体见Github。

void clear()
{
        uncreate();
}

iterator erase(iterator it)
{
        for(iterator i=it;i!=avail;++i)
        {
            alloc.destroy(i);
            if ((i + 1) != avail) alloc.construct(i, *(i + 1));
        }
        --avail;
        return it;
}

11-7. Once you've added erase and clear toVec, you can use that class instead ofvector in most of the earlier programs in this book. Rewrite theStudent_info programs from Chapter 9 and the programs that work with character pictures from Chapter 5 to useVecs instead ofvectors.

Ans:因为需要判断学生是否做了家庭作业,故需要在11-6基础上添加判断容器vector<double> homework是否为空的empty()成员函数,具体见Github。

bool empty() const { return data == avail; }

11-8. Write a simplified version of the standard list class and its associated iterator.

Ans:
vector:利用数组实现;顺序存储结构,采用预分配策略分配内存;可随机访问元素所以利用索引实现元素访问;仅支持后插故只实现push_back();

list:利用双向链表实现;采用链式存储结构,不需要预分配;不支持随机访问即不支持索引,利用迭代器++和--以实现遍历;支持前插push_fron()和后插push_back()以及insert()等操作;

//节点结构如下:
template <class T>
struct node{
    T data;//数据域
    node<T> *prior,*next;//前向和后向指针

    node(){}
    node(const T& t)
    {
        data=t;
        next=0;
        prior=0;
    }
};

具体见Github。

11-9. The grow function in §11.5.1/208 doubles the amount of memory each time it needs more. Estimate the efficiency gains of this strategy. Once you've predicted how much of a difference it makes, change thegrow function appropriately and measure the difference.

Ans:见Github。

  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Accelerated C++源代码 本书全面介绍了C++语言。作为一本入门书(Primer),它以教程的形式对C++语言进行清晰的讲解,并辅以丰富的示例和各种学习辅助手段。与大多数入门教程不同,本书对C++语言本身进行了详尽的描述,并特别着重介绍了目前通行的、行之有效的程序设计技巧。   无数程序员曾使用本书的前几个版本学习C++,在此期间C++也逐渐发展成熟。这些年来,C++语言的发展方向以及C++程序员的关注点,已经从以往注重运行时的效率,转到千方百计地提高程序员的编程效率上。随着标准库的广泛可用,我们现在能够比以往任何时候更高效地学习和使用C++。本书这一版本充分体现了这一点。第4版的改动为了体现现代C++编程风格,我们重新组织并重写了本书。书中不再强调低层编程技术,而把中心转向标准库的使用。书中很早就开始介绍标准库,示例也已经重新改写,充分利用了标准库设施。我们也对语言主题叙述的先后次序进行了重新编排,使讲解更加流畅。除重新组织内容外,为了便于读者理解,我们还增加了几个新的环节。每一都新增了“小结”和“术语”,概括本要点。读者可以利用这些部分进行自我检查;如果发现还有不理解的概念,可以重新学习该中的相关部分。书中还加入了下述几种学习辅助手段:重要术语用黑体表示,我们认为读者已经熟悉的重要术语则用楷体表示。这些术语都会出现在后的“术语”部分。书中用特殊版式突出标注的文字,是为了向读者提醒语言的重要特征,警示常见的错误,标明良好的编程实践,列出通用的使用技巧。希望这些标注可以帮助读者更快地消化重要概念,避免犯常见错误。为了更易于理解各种特征或概念间的关系,书中大量使用了前后交叉引用。.. 对于某些重要概念和C++新手最头疼的问题,我们进行了额外的讨论和解释。这部分也以特殊版式标出。学习任何程序设计语言都需要编写程序。因此,本书提供了大量的示例。所有示例的源代码可从下列网址获得: http://www.awprofessional.com/cpp_primer 万变不离其宗,本书保持了前几版的特色,仍然是一部全面介绍C++的教程。我们的目标是提供一本清晰、全面、准确的指南性读物。我们通过讲解一系列示例来教授C++语言,示例除了解释语言特征外,还展示了如何善用这门语言。虽然读者不需要事先学过C语言(C++最初的基础)的知识,但我们假定读者已经掌握了一种现代结构化语言。本书结构本书介绍了C++国际标准,既涵盖语言的特征,又讲述了也是标准组成部分的丰富标准库。C++的强大很大程度上来自它支持抽象程序设计。要学会用C++高效地编程,只是掌握句法和语义是远远不够的。我们的重点,在于教会读者怎样利用C++的特性,快速地写出安全的而且性能可与C语言低层程序相媲美的程序。 C++是一种大型的编程语言,这可能会吓倒一些新手。现代C++可以看成由以下三部分组成: l 低级语言,多半继承自C。 l 更高级的语言特征,用户可以借此定义自己的数据类型,组织大规模的程序和系统。 l 标准库,使用上述高级特征提供一整套有用的数据结构和算法。多数C++教材按照下面的顺序展开:先讲低级细节,再介绍更高级的语言特征;在讲完整个语言后才开始解释标准库。结果往往使读者纠缠于低级的程序设计问题和复杂类型定义的编写等细节,而不能真正领会抽象编程的力量。就更不用说学到足够的知识去创建自己的抽象了。本版中我们独辟蹊径。一开始就讲述语言的基础知识和标准库,这样读者就可以写出比较大的有实际意义的程序来。透彻阐释了使用标准库(并且用标准库编写了各种抽象程序)的基础知识之后,我们才进入下一步,学习用C++的其他高级特征,来编写自己的抽象。第一和第二部分讨论语言的基础知识和标准库设施。其重点在于学会如何编写C++程序,如何使用标准库提供的抽象设施。大部分C++程序员需要了解本书这两部分的内容。除了讲解基础知识以外,这两部分还有另外一个重要的意图。标准库设施本身是用C++编写的抽象数据类型,定义标准库所使用的是任何C++程序员都能使用的构造类的语言特征。我们教授C++的经验说明,一开始就使用设计良好的抽象类型,读者会更容易理解如何建立自己的类型。第三到第五部分着重讨论如何编写自己的类型。第三部分介绍C++的核心,即对类的支持。类机制提供了编写自定义抽象的基础。类也是第四部分中所讨论的面向对象编程和泛型编程的基础。全书正文的最后是第五部分,我们在这一部分讨论了一些高级特征,它们在构建大型复杂系统时最为常用。致谢与前几版一样,我们要感谢Bjarne Stroustrup,他不知疲倦地从事着C++方面的工作,他与我们的深厚友情由来已久。我们还要感谢Alex Stepanov,正是他最初凭借敏锐的洞察力创造了容器和算法的概念,这些概念最终形成了标准库的核心。此外,我们要感谢C++

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值