C++Primer第4版习题解答第十章Word文档下载推荐.docx
《C++Primer第4版习题解答第十章Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C++Primer第4版习题解答第十章Word文档下载推荐.docx(38页珍藏版)》请在冰豆网上搜索。
while(cin>
>
str>
iVal)
pairVec.push_back(pair<
string,int>
(str,iVal));
\n\tThecontentofpairVecis:
;
for(vector<
:
iteratorit=pairVec.begin();
it!
=pairVec.end();
++it)
{
cout<
it->
first<
<
second<
endl;
}
system("
pause"
);
return0;
}
2.在前一题中,至少可使用三种方法创建pair对象。
编写三个版本的程序,分别采用不同的方法来创建pair对象。
你认为哪一种方法更易于编写和理解,为什么?
newPair;
//firstmethod
//thesecondmethod
newPair=make_pair(str,iVal);
pairVec.push_back(newPair);
//thirdmethod
while(cin>
newPair.first>
newPair.second)
}
第二种方法更好一些,更容易阅读和理解。
因为它调用了make_pair函数,可以明确地表明确实生成了pair对象这一行为。
3.描述关联容器和顺序容器的差别。
两者的本质差别在于:
关联容器通过键key存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。
4.举例说明list、vector、deque、map以及set类型分别使用的情况。
list类型适用于需要在容器的中间位置插入和删除元素的情况,如以无序的方式读入一系列学生的数据;
vector类型适用于需要随机访问元素的情况。
如:
在学号为1…n的学生中,访问第x学号的学生的信息。
deque类型适用于在容器的尾部或首部有插入和删除元素情况。
对服务窗口先来先服务的情况。
map适用于需要key–value对的集合的情况。
字典电和话簿的建立和使用。
set类型适用于使用键集合的情况。
例如,黑名单的建立和使用。
5.定义一个Map对象,将单词与一个list对象关联起来,该list对象存储对应的单词可能出现的行号。
map<
string,list<
int>
wordLines;
6.可否定义一个map对象以vector<
interator为键关联int型对象?
如果以list<
iterator关联int型对象呢?
或者,以pair<
int,string>
关联int?
对于每种情况,如果允许,请解释其原因。
可以定义一个map对象以vector<
iterator和pair<
int,string>
为键关联int型对象。
不能定义第二种情况,因为键类型必须支持<
操作,而list容器的迭代器类型不支持<
操作。
pair<
关联int可以。
7.对于以int型对象为索引关联vector<
型对象的map容器,它的mapped_type。
key_type和value_type分别是什么?
分别是:
int和pair<
constint,vector<
。
8.编写一个表达式,使用map的迭代器给其元素赋值。
m;
iteratormap_it=m.begin();
map_it->
second=val;
//只能对map的值成员元素赋值。
不能对键进行赋值。
9.编写程序统计并输出所读入的单词出现的次数。
//11.16_10.9_wordcount.cpp:
map>
map<
wordCount;
stringword;
word)
++wordCount[word];
Theword'
"
word<
'
appearsfor"
<
wordCount[word]<
times."
10.解释下面程序的功能:
int,int>
m[0]=1;
比较上一程序和下面程序的行为
vector<
v;
v[0]=1;
首先创建一个空的map容器m,然后再m中增加一个键为0的元素,并将其值赋值为1,
第二段程序将出现运行时错误,因为v为空的vector对象,其中下标为0的元素不存在。
对于vector容器,不能对尚不存在的元素直接赋值,只能使用push_back、insert等函数增加元素。
11.哪些类型可用做map容器对象的下标?
下标操作符返回的又是什么类型?
给出一个具体例子说明,即定义一个map对象,指出哪些类型可用作其下标,以及下标操作符返回的类型。
可用作map容器的对象的下标必须是支持<
操作符的类型。
下标操作符的返回类型为map容器中定义的mapped_type类型。
如map<
可用于其下标的类型为string类型以及C风格字符串类型,下标的操作符返回int类型。
12.重写10.3.4节习题的单词统计程序,要求使用insert函数代替下标运算。
你认为哪个程序更容易编写和阅读?
请解释原因。
//11.16_10.12_wordCount_insert.cpp:
Inputsomewords(ctrl+ztoend):
pair<
iterator,bool>
ret=
wordCount.insert(make_pair(word,1));
if(!
ret.second)
++ret.first->
second;
for(map<
iteratorit=wordCount.begin();
=wordCount.end();
(*it).first<
(*it).second<
times."
13.假设有map<
string,vector<
类型,指出在该容器中插入一个元素的insert函数应具有的参数类型和返回值类型。
参数类型:
conststring,vector<
返回值类型:
string,vector<
14.map容器的count和find运算有何区别?
前者返回map容器中给定的键K的出现次数,且返回值只能是0或者1,因为map只允许一个键对应一个实例。
后者返回给定键K元素索引时指向元素的迭代器,若不存在此K值,则返回超出末端迭代器。
15.你认为count适合用于解决哪一类问题?
而find呢?
count适合用于判断map容器中某键是否存在,find适合用于在map容器中查找指定键对应元素。
16.定义并初始化一个变量,原来存储调用键为string,值为vector<
的map对象的find函数的返回结果。
iteratorit=xMap.find(K);
17.上述转换程序使用了find函数来查找单词:
string,string>
const_iteratormap_it=trans_map.find(word);
你认为这个程序为什么要使用find函数?
如果使用下标操作符又会怎样?
使用find函数,是为了当文本中出现的单词word是要转换的单词时,获取该元素的迭代器,以便获取对应的转换后的单词。
如果使用下标,则必须先通过使用count函数来判断元素是否存在,否则,当元素不存在时,会创建新的元素并插入到容器中从而导致单词转换结果不是预期效果
18.定义一个map对象,其元素的键是家族姓氏,而值则是存储该家族孩子名字的vector对象。
为这个map容器输入至少六个条目。
通过基于家族姓氏的查询检测你的程序,查询应输出该家族所有孩子的名字。
//11..16_10.18_map_vector_children'
sName.cpp:
children;
stringfamName,childName;
do
Inputfamilies'
name(ctrl+ztoend):
cin>
famName;
cin)
break;
vector<
chd;
iterator,bool>
children.insert(make_pair(famName,chd));
{
cout<
Alreadyexistthefamilyname:
famName<
continue;
}
\n\tInputchildren'
sname(ctrl+ztoend):
while(cin>
childName)
ret.first->
second.push_back(childName);
cin.clear();
}while(cin);
cin.clear();
\n\tInputafamilynametosearch:
cin>
iteratoriter=children.find(famName);
if(iter==children.end())
\n\tSorry,thereisnotthisfamilyname:
else
\n\tchildren:
iteratorit=iter->
second.begin();
while(it!
=iter->
second.end())
*it++<
19.把上一题的map对象再扩展一下,使其vector对象存储pair类型的对象,记录每个孩子的名字和生日。
相应地修改程序,测试修改后的测试程序以检查所编写的map是否正确。
string,string>
stringfamName,childName,childBday;
\nInputfamilies'
\nAlreadyexistthefamilyname:
\tInputchildren'
snameandbirthday(ctrl+ztoend):
childName>
childBday)
second.push_back(make_pair(childName,childBday));
\n\tThefamily'
schildrenandeverychild'
sbirthdayis:
---"
it++;
20.列出至少三种可以使用map类型的应用。
为每种应用定义map对象,并指出如何插入和读取元素。
字典:
dictionary;
电话簿:
telBook;
超市物价表:
string,double>
priceList;
插入元素可以用:
下标操作符或insert函数;
用find函数读取元素。
21.解释map和set容器的差别,以及它们各自适用的情况。
差别:
map容器是K-V对的集合,set容器是键的集合;
map类型适用于需要了解键与值的对应情况,而set类型适用于只需判断某值是否存在的情况。
22.解释set和list容器的差别,以及它们各自适用的情况。
set容器中的元素不能修改,而list容器中的元素可以修改;
set容器适用于保存元素值不变的集合,而list容器适用于保存会发生变化的元素。
23.编写程序将排除的单词存储在vector对象中,而不是存储在set对象中。
请指出使用set的好处。
//11.16_10.23_restricted_wc.cpp:
set>
voidrestricted_wc(vector<
strVec,map<
&
wordCount)
//createasetofexcludedwords
set<
excluded;
iteratorit=strVec.begin();
=strVec.end();
excluded.insert(*it);
InputsomewordstocountthewordsinwordCount(map)(ctrl+ztoend):
excluded.count(word))
++wordCount[word];
Inputsomewordstovector<
excluded(ctrl+ztoend):
excludedVec;
stringexcludedWord;
excludedWord)
excludedVec.push_back(excludedWord);
//userestricted_wc()
restricted_wc(excludedVec,wordCount);
//showoutthemap:
wordCount
\n\tShowoutthemap:
wordCount:
24.编写程序通过删除单词尾部的’s’生成单词的非负数版本。
同时,建立一个单词排除集,用于识别以’s’结尾,但这个结尾的’s’又不能删除的单词。
例如,放在该排除集中的单词可能有success和class。
使用这个排除集编写程序,删除输入单词的复数后缀,而如果输入的是排除集中的单词,则保持该单词不变。
//11.16_10.25_exclude_s_of_words_wc.cpp:
stdafx.