C++学习日记(第九章)
本帖最后由 SstudentT 于 2015-4-12 13:24 编辑我写的是
C++ Primer 英文第五版 每章课后习题解答
本来打算在一个帖子写上所有的章节课后解答的,后来发现吾爱经常清理不活跃的人。。。
欢迎大家和我交流这本书的课后习题,指出我的不足。十分感谢!由于题目解答较短,容易理解,我就不写注释了。
/*
Exercise 9.1:
Which is the most appropriate—a vector, a deque, or a list—for the following program tasks?
Explain the rationale for your choice.
If there is no reason to prefer one or another container, explain why not.
(a) Read a fixed number of words, inserting them in the container alphabetically as they are entered. We’ll see in the next chapter that associative containers are better suited to this problem.
(b) Read an unknown number of words. Always insert new words at the back. Remove the next value from the front.
(c) Read an unknown number of integers from a file. Sort the numbers and then print them to standard output.
习题一的答案摘自git上的解答,虽然我选的答案跟他的一样,但是我说不出个所以然,而且我的英语表达能力太差 ,就尽量不献丑了。
(a)`std::set` is the best. now, we can select `vector` or `deque`, better than `list`, cause we don't need insert or delete elements in the middle.
(b) `deque`.
If the program needs to insert or delete elements at the front and the back, but not in the middle, use a deque
(c) `vector`, no need that insert or delete at the front or back. and
If your program has lots of small elements and space overhead matters, don’t
use list or forward_list.
*/
/*exercise9.11
Show an example of each of the six ways to create and initialize a vector.Explain what value each vector contains.
*/
#include<iostream>
#include<vector>
void Example(const std::vector<int>&v,int index);
int main()
{
using std::vector;
vector<int> v1; //Don't have any element
vector<int> v2={11,22,33,44,55 }; //Five elements :1122334455
vector<int> v3=v2; //Same as v2
vector<int> v4(10,1); //Ten elements,each initialized to 1
vector<int> v5(10); //Ten elements,each initialized to 0
vector<int> v6(v3.cbegin(),v3.cend());//Same as v3
Example(v1,1);
Example(v2,2);
Example(v3,3);
Example(v4,4);
Example(v5,5);
Example(v6,6);
}
void Example(const std::vector<int>&v,int index)
{
std::cout<<"Vector"<<index<<" element:";
for(auto p:v)
std::cout<<p<<" ";
std::cout<<std::endl;
}
本帖最后由 SstudentT 于 2015-4-11 00:10 编辑
/*
exercise9.6
What is wrong with the following program? How might you correct it?
list<int> lst1;
list<int>::iterator iter1=lst1.begin(),iter2=lst2.end();
while(iter1<iter2)
*/
Answer:
We can't use the operator < to the list. We can use != to replace <.
/*
exercise9.7
What type should be used as the index into a vector of ints ?
*/
Answer: Page330
vector<int>::size_type
Unsigned integral type big enough to hold the size of the largest possible container of this container type
/*
exercise9.8
What type should be used to read elements in a list of strings? To write them?
*/
Answer:
If just read:list<string>::const_iterator
Need to write them: list<string>::iteraotr
/*
exercise9.9
What is the difference between the begin and cbegin functions?
*/
Answer:
The begin function returns thecontainer_type<data_type>::iterator.
You can change the element value through the iterator returned by begin function.
The cbegin function returns the container_type<data_type>::const_iterator.
The first letter in the "cbegin" is 'c' denote the "const". So you can't change the valuethrough the const_iterator.
/*
exercise9.10
What are the types of the following four objects?
vector<int> v1;
const vector<int> v2;
auto it1=v1.begin(),it2=v2.begin();
auto ti3=v1.cbegin(),it4=v2.cbegin();
*/
Answer:
auto it1 = v1.begin();
auto it2 = v2.begin(), it3 = v1.cbegin(), it4 = v2.cbegin();
D:\CodeBlocks\myproject\C++Primer\TestMind\main.cpp|9|error: inconsistent deduction for 'auto': '__gnu_cxx::__normal_iterator<int*, std::vector<int> >' and then '__gnu_cxx::__normal_iterator<const int*, std::vector<int> >'|
/*
exercise 9.2
Define a list that holds elements that are deques that hold ints.
*/
#include <iostream>
#include<list>
#include<deque>
int main()
{
using std::list;
using std::deque;
list<deque<int>> ls;
deque<int> deq1={1,1,2,3,5,8,13};
deque<int>deq2={21,33};
ls.push_back(deq1);
ls.push_back(deq2);
auto it=ls.begin();
for(;it!=ls.cend();it++)
{
for(auto de:*it)
std::cout<<de<<" ";
std::cout<<std::endl;
}
return 0;
}
完全看不懂 {:1_908:}看不懂英语 本帖最后由 SstudentT 于 2015-4-12 13:26 编辑
未来明星 发表于 2015-4-9 20:59
完全看不懂英语差 咋办
别提了,我英语比你好不到那里去。
六级至今未敢报名。
要是对编程有兴趣,专业英语必须得学啊!以后经常用的到!
我刚开始看的时候是一个词一个词查的,根本不去记,后来每个不认识的词查了快50遍,我想忘记都难。
经常看就好。
还有,总算有人把沙发拿走了,我等了好久终于让我摆脱了”楼主抢沙发“的罪名。 243201119 发表于 2015-4-9 21:15
看不懂英语
查查单词连起来就懂了! /*
exercise 9.3
What are the constraints on the iterators that form iterator ranges?
*/
Answer: page 331
An iterator range is denoted by a pair of iterators each of which refers to an element, or to one past the last element, in the same.
[begin,end)
/*
exercise 9.4
Write a function that takes a pair of iterators to a vector<int> and an int value. Look for that value in the range and return boo indicating whether it was found.
*/
#include <iostream>
#include <vector>
bool findVecEle(std::vector<int>::const_iterator,std::vector<int>::const_iterator,int ele);
int main()
{
std::vector<int> v={0,1,2,3,4,5,6,7,8,9};
std::cout<<findVecEle(v.cbegin(),v.cend(),13);
return 0;
}
bool findVecEle(std::vector<int>::const_iterator be,std::vector<int>::const_iterator en,int ele)
{
while(be!=en&&*be!=ele)
++be;
return (be==en)?false:true;
}
本帖最后由 SstudentT 于 2015-4-10 17:10 编辑
/*exercise 9.5
Rewrite the previous program to return an iterator to the requested element. Note that the program must handle the case where the element is not found.
*/
#include <iostream>
#include <vector>
std::vector<int>::const_iteratorfindVecEle(std::vector<int>::const_iterator,std::vector<int>::const_iterator,int ele);
int main()
{
std::vector<int> v={0,1,2,3,4,5,6,7,8,9};
std::cout<<*findVecEle(v.cbegin(),v.cend(),17);
return 0;
}
std::vector<int>::const_iterator findVecEle(std::vector<int>::const_iterator be,std::vector<int>::const_iterator en,int ele)
{
while(be!=en&&*be!=ele)
++be;
std::cout<<((be==en)?"Not found! Will output rubbish:":"Found!");
return be;
}
页:
[1]
2