> 文章列表 > C++ Primer第五版_第九章习题答案(11~20)

C++ Primer第五版_第九章习题答案(11~20)

C++ Primer第五版_第九章习题答案(11~20)

文章目录

      • 练习9.11
      • 练习9.12
      • 练习9.13
      • 练习9.14
      • 练习9.15
      • 练习9.16
      • 练习9.17
      • 练习9.18
      • 练习9.19
      • 练习9.20

练习9.11

对6种创建和初始化 vector 对象的方法,每一种都给出一个实例。解释每个vector包含什么值。

vector<int> vec;    // 0
vector<int> vec(10);    // 0
vector<int> vec(10, 1);  // 1
vector<int> vec{ 1, 2, 3, 4, 5 }; // 1, 2, 3, 4, 5
vector<int> vec(other_vec); // 拷贝 other_vec 的元素
vector<int> vec(other_vec.begin(), other_vec.end()); // 拷贝 other_vec 的元素

练习9.12

对于接受一个容器创建其拷贝的构造函数,和接受两个迭代器创建拷贝的构造函数,解释它们的不同。

  • 接受一个容器创建其拷贝的构造函数,必须容器类型和元素类型都相同。
  • 接受两个迭代器创建拷贝的构造函数,只需要元素的类型能够相互转换,容器类型和元素类型可以不同。

练习9.13

如何从一个list初始化一个vector?从一个vector又该如何创建?编写代码验证你的答案。

list<int> ilst(5, 4);
vector<int> ivc(5, 5);vector<double> dvc(ilst.begin(), ilst.end());
vector<double> dvc2(ivc.begin(), ivc.end());
#include <iostream>
#include <string>
#include <vector>
#include <list>using std::list; using std::vector; using std::cout; using std::endl;int main()
{list<int> ilst(5, 4);vector<int> ivc(5, 5);// from list<int> to vector<double>vector<double> dvc(ilst.begin(), ilst.end());for (auto i : ilst) cout << i << " ";cout << endl;for (auto d : dvc) cout << d << " ";cout << endl;// from vector<int> to vector<double>vector<double> dvc2(ivc.begin(), ivc.end());for (auto i : ivc) cout << i << " ";cout << endl;for (auto d : dvc2) cout << d << " ";return 0;
}

练习9.14

编写程序,将一个list中的char * 指针元素赋值给一个vector中的string。

std::list<const char*> l{ "hello", "world" };
std::vector<std::string> v;
v.assign(l.cbegin(), l.cend());

练习9.15

编写程序,判定两个vector是否相等。

std::vector<int> vec1{ 1, 2, 3, 4, 5 };
std::vector<int> vec2{ 1, 2, 3, 4, 5 };
std::vector<int> vec3{ 1, 2, 3, 4 };std::cout << (vec1 == vec2 ? "true" : "false") << std::endl;
std::cout << (vec1 == vec3 ? "true" : "false") << std::endl;

练习9.16

重写上一题的程序,比较一个list中的元素和一个vector中的元素。

std::list<int>      li{ 1, 2, 3, 4, 5 };
std::vector<int>    vec2{ 1, 2, 3, 4, 5 };
std::vector<int>    vec3{ 1, 2, 3, 4 };std::cout << (std::vector<int>(li.begin(), li.end()) == vec2 ? "true" : "false") << std::endl;
std::cout << (std::vector<int>(li.begin(), li.end()) == vec3 ? "true" : "false") << std::endl;

练习9.17

假定c1 和 c2 是两个容器,下面的比较操作有何限制?

if (c1 < c2)
  • c1 和 c2 必须是相同类型的容器并且保存相同类型的元素
  • 元素类型要支持关系运算符

练习9.18

编写程序,从标准输入读取string序列,存入一个deque中。编写一个循环,用迭代器打印deque中的元素。

#include <iostream>
#include <string>
#include <deque>using std::string; using std::deque; using std::cout; using std::cin; using std::endl;int main()
{deque<string> input;for (string str; cin >> str; input.push_back(str));for (auto iter = input.cbegin(); iter != input.cend(); ++iter)cout << *iter << endl;return 0;
}

练习9.19

重写上一题的程序,用list替代deque。列出程序要做出哪些改变。

只需要在声明上做出改变即可,其他都不变。

deque<string> input; 
//改为
list<string> input;

练习9.20

编写程序,从一个list拷贝元素到两个deque中。值为偶数的所有元素都拷贝到一个deque中,而奇数值元素都拷贝到另一个deque中。

#include <iostream>
#include <deque>
#include <list>
using std::deque; using std::list; using std::cout; using std::cin; using std::endl;int main()
{list<int> l{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };deque<int> odd, even;for (auto i : l)(i & 0x1 ? odd : even).push_back(i);for (auto i : odd) cout << i << " ";cout << endl;for (auto i : even)cout << i << " ";cout << endl;return 0;
}