练习9.13容器拷贝初始化条件容器类型必须相同比如都是vector元素类型必须完全匹配比如都是intlistint和vectordouble既不是同一种容器元素类型也不完全匹配所以这种方式会编译报错。vectorint和vectordouble是同一种容器但元素类型不匹配因此会报错解决方法范围初始化范围初始化vectordouble dvec(ilist.begin(), ilist.end());只要求输入迭代器指向的元素可以隐式转换为目标容器的元素类型这里int可以隐式转换为double所以能成功初始化相当于把每个int元素转成double后存入新容器。int main() { //容器初始化 listintilist { 1,2,3,4,5,6,7 }; vectorintivec { 7,6,5,4,3,2,1 }; //容器元素类型不同无法拷贝初始化 //vectordoubleilist_error(ilist); //编译报错 //vectordoubleivec_error(ivec); //正确用法使用范围初始化迭代器隐式类型转换 vectordoubledevc1(ilist.begin(), ilist.end()); vectordoubledevc2(ivec.begin(), ivec.end()); //devc1 容量 大小 cout 容量 devc1.capacity() 大小 devc1.size() endl; //devc1 首尾元素 cout devc1首元素 devc1[0] 尾元素 devc1.back() endl; for (auto num : devc1) { cout num ; } cout endl; //devc2 容量 大小 cout 容量 devc2.capacity() 大小 devc2.size() endl; //devc1 首尾元素 cout devc2首元素 devc2[0] 尾元素 devc2.back() endl; for (auto num : devc2) { cout num ; } cout endl; return 0; }练习9.14问题分析不能直接用赋值赋值条件容器类型相同元素类型也要兼容char*可以隐式转换为string但vectorchar*也不能直接赋值给vectorstring因为赋值运算符要求元素类型也完全匹配。listchar*和vectorstring是不同的容器类型而赋值运算符要求左右两边是同类型容器所以svec slist;会编译报错。assign()可以实现赋值vector的assign(first, last)成员函数是范围赋值方式它的要求是输入迭代器[first, last)指向的元素可以隐式转换为目标容器的元素类型。这里char*C 风格字符串可以隐式转换为std::string所以svec.assign(slist.begin(), slist.end());可以成功执行相当于遍历list的每个元素逐个转换为string后存入vector。int main() { //存储C风格字符串的list listconst char*slist { hello,bit }; //原容器 vectorstringsvec; //目标容器 //容器不容元素类型不同不能直接复制 /*svec slist;*/ //编译报错 //正确做法 //使用assign 进行范围赋值 svec.assign(slist.begin(), slist.end()); //容量 大小 cout 容量 svec.capacity() 大小 svec.size() endl; //首尾元素 cout 首元素 svec[0] 尾元素 svec.back() endl; for (const string str : svec) { cout str ; } cout endl; return 0; }例题9.15C 标准库的容器包括vector都重载了运算符判断逻辑如下两个容器的元素个数size必须相同两个容器中对应位置的元素必须依次相等capacity容器当前预分配的内存容量不影响相等性判断只有size和元素内容才是关键。int main() { vectorintvec { 1,2,3,4,5,6,7 }; vectorintvec4 { 1,2,3,4,5,6,7 }; vectorintvec1 { 1,2,3,4,5,6 }; //个数不同 vectorintvec2 { 1,2,3,4,5,6,8 }; //最后一个元素不同 vectorintvec3 { 7,6,5,4,3,2,1 }; //顺序不同 cout (vec vec1) endl; cout (vec vec2) endl; cout (vec vec3) endl; cout (vec vec4) endl; //测试扩容是否影响相等性 vec4.push_back(8); vec4.pop_back(); cout vec4.capacity() vec4.size() endl; cout (vec vec4) endl; //不影响 return 0; }练习9.20int main() { //odd_d 奇数even_d 偶数 listintilist { 1, 2, 3, 4, 5, 6, 7, 8 }; dequeintodd_d, even_d; for (auto iter ilist.cbegin(); iter ! ilist.end(); iter) { if (*iter % 20) // 能被2整除的是偶数 { even_d.push_back(*iter); } else //反之是奇数 { odd_d.push_back(*iter); } } //奇数 for (auto iter1 odd_d.cbegin(); iter1 ! odd_d.cend(); iter1) { cout *iter1 ; } cout endl; //偶数 for (auto iter2 even_d.cbegin(); iter2 ! even_d.cend(); iter2) { cout *iter2 ; } cout endl; return 0; }练习9.21int main() { liststring l1; string word; auto iter l1.end(); while (cin word) { iter l1.insert(iter, word); //insert(iter,word) 在iter前插入元素 } for (auto iter1 l1.begin(); iter1 ! l1.end(); iter1) { cout *iter1 ; } cout endl; return 0; }