您的位置:首页 > 编程语言 > C语言/C++

《C++ Primer Plus(第六版)》(35)(第十六章 string类和标准模板库 复习题答案)

2017-01-02 15:55 573 查看
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 <iostream>
#include "Test.h"
#include <ctype.h>
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<int> pia(new int[20]);// new出来的是数组,返回的是地址,可以看做是指针,这个指针不能指向指针
auto_ptr<string> (new string);//没有变量名
int rigue = 7;
auto_ptr<int>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 <iostream>
#include <string>
#include <list>
#include <vector>
#include <algorithm>
#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<Review> 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<Review> 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 <iostream>
#include <list>
#include <iterator>
#include <algorithm>
#include "Test.h"
#include <ctype.h>
using namespace std;
using namespace FableGame;

template <class T>
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<int> f100(100);
int vals[10] = { 50, 100, 90, 180, 60, 210, 415, 88, 188, 201};
list<int> yadayada{vals, vals + 10};
list<int> 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<int>(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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐