> 文章列表 > C++ Primer第五版_第十章习题答案(31~40)

C++ Primer第五版_第十章习题答案(31~40)

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需要随机访问迭代器

搞笑gif下载