博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《C++ Primer Plus(第六版)》(35)(第十六章 string类和标准模板库 复习题答案)...
阅读量:5078 次
发布时间:2019-06-12

本文共 5617 字,大约阅读时间需要 18 分钟。

1.考虑下面的类声明:

class RQ1    {    private:        char* st;    public:        RQ1()        {            st = new char[1];            strcpy(st, "");        }        RQ1(const char* s)        {            st = new char[strlen(s) + 1];            strcpy(st, s);        }        RQ1(const RQ1& rq)        {            st = new char[strlen(rq.st) + 1];            strcpy(st, rq.st);        }        ~RQ1()        {            delete [] st;        }        RQ1 & operator=(const RQ1& rq);    };
将它转换成使用string对象声明,哪些方法不在需要显式定义?

RQ1(const RQ1& rq);RQ1 & operator=(const RQ1& rq);
这两个都不需要了。
RQ1()虽然也没需要写任何东西了,但是必须保留,作为默认构造函数。

class RQ1    {    private:        string st;    public:        RQ1(){}        RQ1(const char* s):st(s){}        ~RQ1(){}    };

2.在易于使用方面,指出string对象至少两个优于C-风格字符串的地方。

可以直接使用=

在一般情况下,即不考虑最大长度的情况下,不需要考虑长度。

3.编写一个函数,用string对象作为参数,将string对象转换成全部大写。

////  main.cpp//  HelloWorld////  Created by feiyin001 on 16/12/30.//  Copyright (c) 2016年 FableGame. All rights reserved.//#include 
#include "Test.h"#include
using namespace std;using namespace FableGame;void toUpper(char& ch){ ch = toupper(ch);}void changeUp(string& s){ for_each(s.begin(), s.end(), toUpper);}int main(){ string s = "sssssss"; changeUp(s); cout << s << endl; return 0;}
4.从概念上或语法上说,下面哪个不是正确使用auto_ptr的方法(假设已经包含了所需的头文件)?

auto_ptr
pia(new int[20]);// new出来的是数组,返回的是地址,可以看做是指针,这个指针不能指向指针auto_ptr
(new string);//没有变量名int rigue = 7;auto_ptr
pr(&rigue);//不能指向自动变量auto_ptr dbl(new double);//不能指向其他类型数据
5.如果可以生成一个存储高尔夫球棍(而不是数字)的栈,为何它(从概念上说)是一个坏的高尔夫袋子?

栈是后进先出,永远只能获取最上面的内容。

高尔夫袋子装棍子,都是按需要取出想要的球棍,应该用一个可以随机访问的容器来存储。

6.为什么说对于逐洞记录高尔夫成绩来说,set容器是糟糕的选择?

set容器是不能存放相同分数的,而且,set会自动排序,先放进去的不一定在前面。

7.既然指针是一个迭代器,为什么STL设计人员没有简单地使用指针来代替迭代器呢?

使用指针,只能操作数组。使用迭代器使得能够使用接口类似于指针的对象遍历不以数组方式组织的数据,如双向链表中的数据。

8.为什么STL设计人员仅定义了迭代器基类,而使用继承来派生其他迭代器类型的类,并根据这些迭代器来表示算法?

因为这些迭代器,都必须遵循同样的基本规则来运行,这样才能让一些算法对于各种迭代器都通用。

9.给出vector对象比较常规数组方便的3个例子。

获取数组长度,传递参数的时候不需要额外一个字段

可以自动扩展和收缩空间,

可以将vector赋值给另一个对象。

使用at()方法可以自动检测边界。

10.如果程序清单16.9是使用list(而不是vector)实现的,则该程序哪部分将是非法的?非法的部分能够轻松修复吗?如如果可以,如何修复?

////  main.cpp//  HelloWorld////  Created by feiyin001 on 16/12/30.//  Copyright (c) 2016年 FableGame. All rights reserved.//#include 
#include
#include
#include
#include
#include "Test.h"using namespace std;using namespace FableGame;struct Review{ string title; int rating;};bool operator<(const Review& r1, const Review& r2);bool worseThan(const Review& r1, const Review& r2);bool fillReview(Review& rr);void showReview(const Review& rr);int main(){ list
books; Review temp; while (fillReview(temp)) { books.push_back(temp); } if (books.size() > 0) { cout << "Thank you. You entered the following " << books.size() << " ratings:\n" << "Rating\tBook\n"; for_each(books.begin(), books.end(), showReview); books.sort(); //sort(books.begin(), books.end());//#1 cout << "Sorted by title:\nRating\tBook\n"; for_each(books.begin(), books.end(), showReview); books.sort(worseThan); //sort(books.begin(), books.end(), worseThan);//#2 cout << "Sorted by rating:\nRating\tBook\n"; for_each(books.begin(), books.end(), showReview); //random_shuffle(books.begin(), books.end());//#3 vector
temp; copy(books.begin(), books.end(), std::back_inserter( temp)); random_shuffle(temp.begin(), temp.end()); books.clear(); copy(temp.begin(), temp.end(), back_inserter(books)); cout << "After shuffling:\nRating\tBook\n"; for_each(books.begin(), books.end(), showReview); } else{ cout << "No entries."; } cout << "bye.\n"; return 0;}bool operator<(const Review& r1, const Review& r2){ if (r1.title < r2.title) { return true; } else if(r1.title == r2.title && r1.rating < r2.rating) { return true; } else { return false; }}bool worseThan(const Review& r1, const Review& r2){ if (r1.rating < r2.rating) { return true; } else { return false; }}bool fillReview(Review& rr){ cout << "Enter book title (quit to quit): "; getline(cin, rr.title); if (rr.title == "quit" || rr.title == "q") { return false; } cout << "Enter book rating: "; cin >> rr.rating; if (!cin) { return false; } while (cin.get() != '\n') { continue; } return true;}void showReview(const Review& rr){ cout << rr.rating << "\t" << rr.title << endl;}
这是修改后的代码了。

#1和#2,公用sort要求可以随机访问,但是list不支持,所以list提供了自己的sort。

#3,list不支持随机打乱,只能先转到vector,然后打乱,再转回来。

11.假设有程序清单16.15所示的函数符TooBig,下面的代码有何功能?赋给bo的是什么值?

bool bo = TooBig<int>(10)(15);

先看看原来的代码先。

////  main.cpp//  HelloWorld////  Created by feiyin001 on 16/12/30.//  Copyright (c) 2016年 FableGame. All rights reserved.//#include 
#include
#include
#include
#include "Test.h"#include
using namespace std;using namespace FableGame;template
class TooBig {private: T cutoff; public: TooBig(const T& t):cutoff(t){} bool operator()(const T& v){return v > cutoff; }};void outint(int n) { cout << n << " ";}int main(){ TooBig
f100(100); int vals[10] = { 50, 100, 90, 180, 60, 210, 415, 88, 188, 201}; list
yadayada{vals, vals + 10}; list
etcetera{vals, vals + 10}; cout << "Original lists:\n"; for_each(etcetera.begin(), etcetera.end(), outint); cout << endl; yadayada.remove_if(f100); etcetera.remove_if(TooBig
(200)); cout << "Trimmed lists:\n"; for_each(yadayada.begin(), yadayada.end(), outint); cout << endl; for_each(etcetera.begin(), etcetera.end(), outint); cout << endl; return 0;}
10是用来初始化TooBig的,15是用来进行比较的,15 > 10 ,所以返回true, bo的值是true。

转载于:https://www.cnblogs.com/fablegame/p/6430229.html

你可能感兴趣的文章
Object Builder Application Block
查看>>
hibernate入门--->张国亮总结第二季
查看>>
从Windows迁移SQL Server到Linux
查看>>
IOS开发之实现App消息推送
查看>>
Workspace defines a VM that does not contain a valid jre/lib/rt.jar: C:\Program Files\Java\jre7
查看>>
java多线程有哪些实际的应用场景?
查看>>
动态分配内存-realloc
查看>>
PHP 程序员学数据结构与算法之《栈》
查看>>
Three typical types of Data Mining applications
查看>>
通过rsync+inotify实现数据实时备份
查看>>
四种第三方登录(附源码)(转)
查看>>
20145305 《信息安全系统设计基础》第12周学习总结
查看>>
【OpenCV应用笔记】(彩色/灰度)图像像素值读取并保存到txt文件
查看>>
一句话输出NGINX日志访问IP前十位排行
查看>>
Linux SendMail 使用外部SMTP服务发送邮件
查看>>
thinkPHP5.0 获取域名
查看>>
PKU P2411 Mondriaan's Dream
查看>>
策略模式
查看>>
分布式Hadoop安装(一)
查看>>
204. Count Primes
查看>>