《C++primer》v5 第3章 字符串、向量和数组 读书笔记 习题答案
本章问题
1.char *p="hello world";与char p[]="hello world"的问题。
简单说前者是一个指向字符串常量的指针,后者是一个分配了相应内存并被初始化的字符数组。前者不可改,后者可改。
详细可参阅这里http://www.cnblogs.com/Logic0/archive/2009/08/01/1850337.html
2.指针数组和数组指针。
指针数组即指针的数组,int *p[3],它包含了p[0],p[1],p[2]这三个指向int的指针
数组指针即指向一个相应数组的指针,数组也是对象,当然有指向它的指针。但是这里要注意,必须指明数组的维度。仅第一维可省略。如:
int a[10]; int *p=a;
int a[10][5]; int (*p)[5]=a;
int a[10][5][8]; int (*p)[5][8]=a;
注意括号不能省!
这里的指针p的增量都是以第一维长度为基本单位的。
具体可参阅这里:http://baike.baidu.com/view/3026322.htm?fr=aladdin
课后题解
3.1略
3.2
string str;
//读行
while(getline(cin,str))
cout<<str<<endl;
//读单个词
while(cin>>str)
cout<<str<<endl;
3.3
输入运算符读到空白符结束
getline读到换行符结束,并丢弃换行符
3.4
比较大小。
比较大小是比较的第一个不相同的字符的大小。
int main()
{
string a,b;
cin>>a>>b;
if(a==b)
cout<<a<<" "<<b<<endl;
else if(a>b)
cout<<a<<endl;
else
cout<<b<<endl;
;
}
比较长度。
int main()
{
string a,b;
cin>>a>>b;
if(a.size()==b.size())
cout<<a<<" "<<b<<endl;
else if(a.size()>b.size())
cout<<a<<endl;
else
cout<<b<<endl;
;
}
3.5
注意string类型的加法要求+两侧至少有一个是string类型。
int main()
{
string a,str;
while(cin>>a)
str+=a;
cout<<str<<endl;
;
}
int main()
{
string a,str;
while(cin>>a)
str+=a+' ';
cout<<str<<endl;
;
}
3.6
修改变量时,范围for循环要用引用
int main()
{
string str;
cin>>str;
for(auto &c:str)
c='X';
cout<<str<<endl;
;
}
3.7
换成char&,结果似乎是一样的。。
int main()
{
string str;
cin>>str;
for(char &c:str)
c='X';
cout<<str<<endl;
;
}
3.8
while
int main()
{
string str;
cin>>str;
;
while(i<str.size())
str[i++]='X';
cout<<str<<endl;
;
}
传统for循环
int main()
{
string str;
cin>>str;
; i<str.size(); ++i)
str[i]='X';
cout<<str<<endl;
;
}
论方便程度:范围for>传统for>while。其实各有所长吧。
3.9
不合法。如果s为空则s[0]不存在,访问越界!
3.10
需要头文件cctype。第一个c表示从c语言继承而来。
int main()
{
string str;
cin>>str;
for(auto c: str)
if(!ispunct(c))
cout<<c;
;
}
3.11
这是合法的。
auto &c,表示c是指向const char的引用,无法通过修改c来修改字符。
auto c,表示c是char字符的一个拷贝,因为auto不会保留顶层const,所以得到的不是常量。
3.12
(a)末尾的>>可能在旧的编译器中报错。本身定义无错。
(b)错,不同数据类型的vector不能赋值。任何不同的都不行!
(c)这个是对的。调用了vector的一个构造函数。
3.13
(a)空
(b)10个0
(c)10个42
(d)1个10
(e)1个10,1个42
(f)10个空string
(g)10个“hi”
3.14
int main()
{
int num;
vector<int> vec;
while(cin>>num)
vec.push_back(num);
;
}
3.15
int main()
{
string str;
vector<string> vec;
while(cin>>str)
vec.push_back(str);
;
}
3.16
int main()
{
vector<int> vec;
int val;
while(cin>>val)
vec.push_back(val);
cout<<"size:"<<vec.size()<<endl;
for(auto c:vec)
cout<<c<<endl;
;
}
3.17、3.18
多重范围for循环除了最内层,其余都要用&,防止数组转化为指针。这里最内层用引用是因为要修改字符。
int main()
{
vector<string> vec;
string str;
while(cin>>str)
vec.push_back(str);
for(auto &i:vec)
for(auto &j:i)
j=toupper(j);
for(auto &i:vec)
cout<<i<<endl;
;
}
3.19
int main()
{
vector<,42.5);
vector<,,,,,,,,,};
vector<,,,,,,,,,};
;
}
显然第一种方式最方便。但是第2、3种方式会提示精度损失的情况,但是第1种方式就不会。
3.20
int main()
{
vector<int> vec;
int val;
while(cin>>val)
vec.push_back(val);
; i<vec.size(); ++i)
cout<<vec[i]+vec[i-]<<endl;
; i<=(vec.size()-)/; ++i)
cout<<vec[i]+vec[vec.size()--i]<<endl;
;
}
3.21
int main()
{
vector<int> vec;
int val;
while(cin>>val)
vec.push_back(val);
for(vector<int>::iterator it=vec.begin(); it!=vec.end(); ++it)
cout<<*it<<endl;
;
}
3.22
int main()
{
string str;
cin>>str;
for(string::iterator it=str.begin(); it!=str.end(); ++it)
*it=toupper(*it);
cout<<str<<endl;
;
}
3.23
int main()
{
vector<,);
for(vector<int>::iterator it=vec.begin();it!=vec.end();++it)
*it*=;
for(auto i:vec)
cout<<i<<endl;
;
}
3.24
经过测试,++vec.begin()返回第二个迭代器,但是vec.begin()仍然是第一个迭代器。
int main()
{
vector<int> vec;
int val;
while(cin>>val)
vec.push_back(val);
for(vector<int>::iterator it=++vec.begin(); it!=vec.end(); ++it)
cout<<*(it-)+*it<<endl;
)/; ++it)
cout<<*it+*(vec.end()--(it-vec.begin()))<<endl;
;
}
3.25
*的优先级高于+-运算,因此需要先计算迭代器再解引用。而++优先级低于*,所以可以保证++的是解引用以后的值。
int main()
{
vector<unsigned> scores(,);
unsigned grade;
while(cin>>grade)
)
++*(scores.begin()+grade/);
for(auto i:scores)
cout<<i<<endl;
;
}
3.26
因为(beg+end)数值可能较大超出范围。
3.27
(a)合法
(b)合法
(c)可能非法。如果该函数返回非正数就会出现问题。
(d)非法,该字符串还有一个‘\0'字符,所以需要至少12个元素来存放。
数组的下标是unsigned类型?
3.28
sa包含10个空的string,ia包含10个0。
sa2包含10个空的string,ia2包含10个未知数。
3.29
数组不能动态增长和添加删除元素。不能用数组直接赋值。。
3.30
不存在下标为array_size的元素,故访问越界
3.31
数组没有用括号初始化的方式,想想不奇怪,数组是内置数据类型,它不是类,没有构造函数。
int main()
{
]={,,,,,,,,,};
;
}
3.32
int main()
{
]={,,,,,,,,,};
vector<int> vec(begin(a),end(a));
for(auto i:vec)
cout<<i<<endl;
;
}
3.33
直接用下标访问将越界,因为不存在相应的元素。
3.34
将p1指向p2所在位置。
该式等价于p1=p1+p2-p1
如果p1+p2、p2-p1超出数组范围将非法。
3.35
int main()
{
]= {,,,,,,,,,};
; i<; ++i)
*(a+i)=;
for(auto i:a)
cout<<i<<endl;
;
}
3.36
如果数组a小于数组b返回1,大于则返回-1,否则返回0。
int compareArray(int *a,int n1,int *b,int n2)
{
;
while(i<n1&&i<n2)
{
if(a[i]<b[i])
;
else if(a[i]>b[i])
;
i++;
}
if(n1==n2)
;
else if(n1<n2)
;
else
;
}
int compareVector(const vector<int> &a,const vector<int> &b)
{
if(a==b)
;
else if(a<b)
;
else
;
}
3.37
代码原意是用一个指针指向了该常量字符数组,并遍历输出。
但是这个常量字符数组缺少了结束符,即'\0'。
所以遍历不会得到想要结果。
int main()
{
const char ca[]={'h','e','l','l','o'};
const char *cp=ca;
while(*cp)
{
cout<<*cp<<endl;
++cp;
}
;
}
3.38
两个指针就是两个地址(非空的情况下),请问两个地址相加有何意义?
3.39
int compareString(const string &a,const string &b)
{
;
while(i<a.size()&&i<b.size())
{
if(a[i]>b[i])
;
else if(a[i]<b[i])
;
i++;
}
if(a.size()==b.size())
;
else if(a.size()>b.size())
;
else
;
}
int compareChar(const char *a,const char *b)
{
;
while(a[i]&&b[i])
{
if(a[i]>b[i])
;
else if(a[i]<b[i])
;
i++;
}
if(!a[i]&&!b[i])
;
else if(a[i])
;
else
;
}
3.40
int main()
{
char x[]="abc",y[]="xyz";
];
strcpy(c,x);
strcat(c,y);
puts(c);
;
}
3.41、3.42
int main()
{
]= {,,,,};
vector<int> vec(begin(a),end(a));
];
; i<vec.size(); ++i)
b[i]=vec[i];
;
}
3.43
这个题有点难度。值得研究一下。
int main()
{
][]= {,,,,,,,,,,,};
]:ia)
for(int j:i)
cout<<j<<endl;
; i<; ++i)
; j<; ++j)
cout<<ia[i][j]<<endl;
]=begin(ia); i!=end(ia); ++i)
for(int *j=begin(*i); j!=end(*i); ++j)
cout<<*j<<endl;
;
}
如果不用begin和end函数:
int main()
{
][]= {,,,,,,,,,,,};
]=ia; i!=ia+; ++i)
; ++j)
cout<<*j<<endl;
;
}
如果是3维:
int main()
{
][][]= {,,,,,,,,,,,,,,,,,,,,,,,};
][]=ia; i!=ia+; ++i)
]=*i; j!=*i+; ++j)
; ++k)
cout<<*k<<endl;
;
}
3.44
int main()
{
][]= {,,,,,,,,,,,};
];
for(int_array &i:ia)
for(int j:i)
cout<<j<<endl;
for(int_array *i=begin(ia); i!=end(ia); ++i)
for(int *j=begin(*i); j!=end(*i); ++j)
cout<<*j<<endl;
;
}
3.45
int main()
{
][]= {,,,,,,,,,,,};
for(auto &i:ia)
for(auto j:i)
cout<<j<<endl;
for(auto i=begin(ia); i!=end(ia); ++i)
for(auto *j=begin(*i); j!=end(*i); ++j)
cout<<*j<<endl;
;
}
《C++primer》v5 第3章 字符串、向量和数组 读书笔记 习题答案的更多相关文章
- <<C++ Primer>> 第三章 字符串, 向量和数组 术语表
术语表 第 3 章 字符串, 向量和数组 begin: 是 string 和 vector 的成员,返回指向第一个元素的迭代器.也是一个标准库函数,输入一个数字,返回指向该数字首元素的指针. 缓 ...
- [C++ Primer] 第3章: 字符串, 向量和数组
标准库类型string string初始化 string s2(s1); string s2 = s1; string s3("value"); string s3 = " ...
- 《C++primer》v5 第8章 IO库 读书笔记 习题答案
8.1.8.2 这一章不咋会啊.. istream &read(istream &is) { int a; auto old_state=is.rdstate(); is.clear( ...
- 《C++primer》v5 第4章 表达式 读书笔记 习题答案
4.1 105 4.2 *vec.begin()=*(vec.begin())//先调用点运算符,再解引用 *vec.begin()+1=(*vec.begin())+1//先解引用,再加一 4.3略 ...
- 《C++primer》v5 第2章 变量和基本类型 读书笔记 习题答案
2.1 int,long long ,short 可表示范围和占用内存空间不同.具体与计算机有关. 无符号类型只能表示0和正数,带符号类型可以表示负数,0,正数. float是单精度,一般占用4个字节 ...
- 《C++primer》v5 第1章 开始 读书笔记 习题答案
从今天开始在博客里写C++primer的文字.主要以后面的习题作业为主,会有必要的知识点补充. 本人也是菜鸟,可能有不对之处,还望指出. 前期内容可能会比较水. 1.1略 1.2略 1.3 cin和c ...
- 《C++primer》v5 第7章 类 读书笔记 习题答案
7.1.7.2.7.3 #include<iostream> #include<cstdio> #include<vector> #include<strin ...
- 《C++primer》v5 第6章 函数 读书笔记 习题答案
6.1 实参是在函数调用处填写的参数.形参是在函数体使用的参数. 实参是形参的初始值. 具体参见:http://blog.163.com/zhengguo_li/blog/static/7030148 ...
- 《C++primer》v5 第5章 语句 读书笔记 习题答案
5.1 空语句只有一个";".如果什么也不想做可以使用空语句. 5.2 用花括号{}括起来的叫块,也叫复合语句.有多条语句作用在同一个作用域时,需要用花括号括起来. 5.3 降低了 ...
随机推荐
- Writing Your Own jQuery Plugins
Setting Up <script src="js/jquery-1.9.1.min.js"></script> <script src=" ...
- 解决secureCRT数据库里没有找到防火墙 '无'问题
中文版的secureCRT由于汉化的问题(把null翻译成无了),导致每次打开都会有个防火墙的错误提示:数据库里没有找到防火墙 '无' 此会话将尝试不通过防火墙进行连接.出现这个错误的原因是在secu ...
- MAC: Homebrew(代替yum)安装
安装 ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)" 最新方式请 ...
- [已解决] MyBatis 中bind用法
JAVA: TC_ENTR_FLOW selectFlowForUpdate(String ENTR_ID); XML: <select id="selectFlowForUpdate ...
- [转]Win7 64位搭建本地SVN服务器 Apache+Subversion
转载地址:http://blog.sina.com.cn/s/blog_4f072a7001015j5z.html 一.工具下载 01.SVN 服务器Subversion:Setup-Subversi ...
- 使用git建立远程仓库,让别人git clone下来
首先, 如果你的ssh没有安装的话,要安装ssh服务端.ubuntu是很简单 sudo apt-get install openssh-server 1,建立你的git 目录. ourunix@ubu ...
- 流镜像(华为S9306和S5700)
流镜像是指将设备.端口或者VLAN内收.发的指定类型报文复制到观察端口上,监控设备只对指定类型报文进行监测. 流镜像有基于ACL和基于MQC(即复杂流分类)两种配置方式.前者配置简便,但是没有后者支持 ...
- 对css中clear元素的理解
clear:left;表示左侧不能有浮动元素. clear:right;表示右侧不能有浮动元素. clear:both;表示左右两侧都不能有浮动元素. 但在使用时,还得考虑css优先级问题.相同类型选 ...
- CentOS安装Nvidia显卡驱动提示Nouveau正在使用的问题
如题,在安装Nvidia官方提供的驱动时,提示Nouveau正在被使用,需要停用后才能继续安装,在网上搜了不少方法,各种尝试后均无效. 最后通过设置内核启动参数给屏蔽了,方法如下: 切换到root用户 ...
- 【树莓派】使用树莓派制作img镜像(二)
树莓派制作的镜像,需要如何使用,这里直接引用目前树莓派官方的文章,不再重复描述: 参考:http://shumeipai.nxez.com/2013/08/31/usb-image-tool.html ...