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;
}