C++Primer5及习题集错误修正汇总(VS环境,持续更新)

本书阅读至今只发现极少数处小错误,不得不再次吹一波Stanley大佬的书!战战兢兢奉上改进清单:

NO.1

【习题集】第14章,练习14.18,给String类定义关系运算符时,有关<=运算符,有小错一处。

bool operator<=(const String &s1,const String &s2)
{
    return strcmp(s1.str, s2.str)<0; //小于号错
}

修改之后为:

bool operator<=(const String &s1,const String &s2)
{
    return strcmp(s1.str, s2.str)<=0; //修改为<=
}

NO.2

【习题集】第14章,练习14.27,给类添加递增递减运算符,关于--符号,也可能是打印问题?感觉大佬不会犯这种低级错误。

StrBlobPtr& operator-(){
    -curr;
    check(-1,"decrement past begin of StrBlobPtr");
    return *this;
}

修改之后为:

StrBlobPtr& operator--(){
    --curr;
    check(curr,"decrement past begin of StrBlobPtr");
    return *this;
}

NO.3

【习题集】第14章,练习14.39,关于readStr函数的声明,缺少返回值类型:

extern readStr(istream &is,vector<string> &vec);

修改之后为:

extern void readStr(istream &is,vector<string> &vec);

NO.4

【习题集】第14章,练习14.43,使用标准库函数对象判断一个给定的int值是否能被int容器中的所有元素整除。缺少函数调用运算符,且将bind1st修改为bind2nd。

bool dividedByAll(vector<int> &ivec, int dividend){
    return count_if(ivec.begin(),ivec.end(),bindlst(modulus<int>,dividend))==0;
}

 修改之后为:

bool dividedByAll(vector<int> &ivec, int dividend){
    return count_if(ivec.begin(),ivec.end(),bind2nd(modulus<int>(),dividend))==0;
}

但C++primer5课本第357页,关于向后兼容的内容阐述,明确了新的C++程序应该使用bind,而非bind1st 和 bind2nd,因为这哥俩分别智能绑定第一个或第二个参数,过于局限了,在新标准中已被弃用。修改为bind后,可运行程序如下:

#include<iostream>
#include<vector>
#include<algorithm> //定义了count_if
#include<functional>//定义了bind、bind1st、bind2nd

using namespace std;
using namespace std::placeholders;//_1定义在该命名空间

bool dividedByAll(vector<int>& ivec, int devidend) {
	return count_if(ivec.begin(), ivec.end(), bind(modulus<int>(),_1, devidend)) == 0;
}

int main() {
	vector<int> iv = {1,2,3,4,5,6,7};
	bool yesOrNo = dividedByAll(iv, 1);
	cout << yesOrNo << endl;
	return 0;
}

NO.5

【习题集】第14章,14.44题,编写一个简单的桌面计算器使其使其能处理二元运算,修改为如下:

#include<iostream>
#include<map>
#include<algorithm>
#include<functional>  //书中缺少该重要头文件

using namespace std;

map<string, function<int(int, int)>> binOps = {
	{"+",plus<int>()},
	{"-",minus<int>()},
	{"*",multiplies<int>()},
	{"/",divides<int>()},
	{"%",modulus<int>()}
};

int main() {
	int left, right; //书中应改为a,b
	string op;
	cin >> left >> op >> right;
	cout << binOps[op](left, right)<<endl;
	return 0;
}
发布了71 篇原创文章 · 获赞 17 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qionggaobi9328/article/details/104865477