C++ Primer第五版_第十章习题答案(31~40)
文章目录
- 练习10.31
- 练习10.32
- 练习10.33
- 练习10.34
- 练习10.35
- 练习10.36
- 练习10.37
- 练习10.38
- 练习10.39
- 练习10.40
练习10.31
修改前一题的程序,使其只打印不重复的元素。你的程序应该使用 unique_copy。
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
vector<int> v;
istream_iterator<int> int_it(cin), int_eof;
unique_copy(int_it, int_eof, back_inserter(v));
sort(v.begin(), v.end());
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}
练习10.32
重写1.6节中的书店程序,使用一个vector保存交易记录,使用不同算法完成处理。使用 sort 和10.3.1节中的 compareIsbn 函数来排序交易记录,然后使用 find 和 accumulate 求和。
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <numeric>
#include "Sales_item.h"
int main()
{
std::istream_iterator<Sales_item> in_iter(std::cin), in_eof;
std::vector<Sales_item> vec;
while (in_iter != in_eof)
vec.push_back(*in_iter++);
sort(vec.begin(), vec.end(), compareIsbn);
for (auto beg = vec.cbegin(), end = beg; beg != vec.cend(); beg = end)
{
end = find_if(beg, vec.cend(), [beg](const Sales_item &item) { return item.isbn() != beg->isbn(); });
std::cout << std::accumulate(beg, end, Sales_item(beg->isbn())) << std::endl;
}
return 0;
}
练习10.33
编写程序,接受三个参数:一个输入文件和两个输出文件的文件名。输入文件保存的应该是整数。使用 istream_iterator 读取输入文件。使用 ostream_iterator 将奇数写入第一个输入文件,每个值后面都跟一个空格。将偶数写入第二个输出文件,每个值都独占一行。
#include <fstream>
#include <iterator>
#include <algorithm>
int main(int argc, char **argv)
{
if (argc != 4) return -1;
std::ifstream ifs(argv[1]);
std::ofstream ofs_odd(argv[2]), ofs_even(argv[3]);
std::istream_iterator<int> in(ifs), in_eof;
std::ostream_iterator<int> out_odd(ofs_odd, " "), out_even(ofs_even, "\n");
std::for_each(in, in_eof, [&out_odd, &out_even](const int i)
{
*(i & 0x1 ? out_odd : out_even)++ = i;
});
return 0;
}
练习10.34
使用 reverse_iterator 逆序打印一个vector。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (auto it = v.crbegin(); it != v.crend(); ++it)
{
cout << *it << endl;
}
return 0;
}
练习10.35
使用普通迭代器逆序打印一个vector。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (auto it = std::prev(v.cend()); true; --it)
{
std::cout << *it << " ";
if (it == v.cbegin()) break;
}
std::cout << std::endl;
return 0;
}
练习10.36
使用 find 在一个 int 的list 中查找最后一个值为0的元素。
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int main()
{
list<int> l = { 1, 2, 0, 4, 5, 6, 7, 0, 9 };
auto it = find(l.crbegin(), l.crend(), 0);
cout << distance(it, l.crend()) << endl;
return 0;
}
练习10.37
给定一个包含10 个元素的vector,将位置3到7之间的元素按逆序拷贝到一个list中。
#include <iostream>
#include <list>
#include <algorithm>
#include <vector>
#include <iterator>
using namespace std;
int main()
{
vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
list<int> l;
copy(v.crbegin() + 3, v.crbegin() + 8, back_inserter(l));
for (auto i : l) std::cout << i << " ";
cout << endl;
return 0;
}
练习10.38
列出5个迭代器类别,以及每类迭代器所支持的操作。
- 输入迭代器 :
==
,!=
,++
,*
,->
- 输出迭代器 :
++
,*
- 前向迭代器 :
==
,!=
,++
,*
,->
- 双向迭代器 :
==
,!=
,++
,--
,*
,->
- 随机访问迭代器 :
==
,!=
,<
,<=
,>
,>=
,++
,--
,+
,+=
,-
,-=
,*
,->
,iter[n]
==*(iter[n])
练习10.39
list 上的迭代器属于哪类?vector呢?
- list 上的迭代器是 双向迭代器
- vector 上的迭代器是 随机访问迭代器
练习10.40
你认为 copy 要求哪类迭代器?reverse 和 unique 呢?
- copy 需要两个输入迭代器,一个输出迭代器
- reverse 需要双向迭代器
- unique需要随机访问迭代器