当前位置:   article > 正文

C++ Primer(第五版) 9.3.4--9.3.6节练习_c++primer练习9.30

c++primer练习9.30

9.27 

  1. #include <iostream>
  2. #include <forward_list>
  3. using namespace std;
  4. int main()
  5. {
  6. forward_list<int> flist = {1, 2, 3, 4, 5, 6, 7, 8};
  7. auto prev = flist.before_begin();
  8. auto curr = flist.begin();
  9. while (curr != flist.end()) {
  10. if ((*curr)%2)
  11. curr = flist.erase_after(prev);
  12. else {
  13. prev = curr;
  14. ++curr;
  15. }
  16. }
  17. for (auto i : flist)
  18. cout << i << endl;
  19. return 0;
  20. }

9.28

  1. #include <iostream>
  2. #include <forward_list>
  3. using namespace std;
  4. void flist_insert(forward_list<string> &flist, const string s1, const string s2)
  5. {
  6. auto prev = flist.before_begin();
  7. auto curr = flist.begin();
  8. bool insert = false;
  9. while (curr != flist.end()) {
  10. if (*curr == s1) {
  11. curr = flist.insert_after(curr, s2);
  12. prev = curr;
  13. ++curr;
  14. insert = true;
  15. } else {
  16. prev = curr;
  17. ++curr;
  18. }
  19. }
  20. if (!insert) {
  21. flist.insert_after(prev, s2);
  22. }
  23. }
  24. int main()
  25. {
  26. forward_list<string> flist = {"s1", "s2", "s3", "s4", "s2", "s6"};
  27. flist_insert(flist, "s2", "s5");
  28. for (auto s : flist)
  29. cout << s << endl;
  30. flist_insert(flist, "s6", "s8");
  31. for (auto s : flist)
  32. cout << s << endl;
  33. /* 所有元素都相同的情况 */
  34. forward_list<string> flist2 = {"s1", "s1", "s1", "s1"};
  35. flist_insert(flist2, "s1", "s1");
  36. for (auto s : flist2)
  37. cout << s << endl;
  38. return 0;
  39. }

9.29    vec.resize(100)会向末尾新增75个元素,这些元素进行值初始化;vec.resize(10)会删除末尾的90个元素。

9.30    接受单个参数,要求该元素类型有默认构造函数。

9.31    list和forward_list的元素在内存中不连续,不支持迭代器的加减运算。修改程序如下:

  1. #include <iostream>
  2. #include <list>
  3. #include <forward_list>
  4. using namespace std;
  5. int main()
  6. {
  7. list<int> ilist = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  8. forward_list<int> flist = {0, 1, 2, 3, 4, 5, 6 ,7, 8, 9};
  9. auto iter = ilist.begin();
  10. while (iter != ilist.end()) {
  11. if (*iter % 2) {
  12. iter = ilist.insert(iter, *iter);
  13. ++iter;
  14. ++iter;
  15. } else {
  16. iter = ilist.erase(iter);
  17. }
  18. }
  19. for (auto i : ilist)
  20. cout << i << endl;
  21. auto prev = flist.before_begin();
  22. auto curr = flist.begin();
  23. while (curr != flist.end()) {
  24. if (*curr % 2) {
  25. curr = flist.insert_after(prev, *curr);
  26. prev = ++curr;
  27. ++curr;
  28. } else {
  29. curr = flist.erase_after(prev);
  30. }
  31. }
  32. for (auto f : flist)
  33. cout << f << endl;
  34. return 0;
  35. }

932.    不合法,编译时会先计算第二个参数 *iter++, iter指向当前奇数的下一个元素,导致第一个参数的值错误。

9.33    向vector添加元素后,指向容器的迭代器,指针和引用都可能失效,不将insert结果赋予begin,begin会失效,继续使用可能导致程序崩溃。

9.34    该代码的目的是复制奇数元素; 代码错误:++iter应该被包括在循环体内,且应该多执行一次++iter。修改如下:

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. int main()
  5. {
  6. vector<int> vi = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  7. auto iter = vi.begin();
  8. while (iter != vi.end()) {
  9. if (*iter % 2) {
  10. iter = vi.insert(iter, *iter);
  11. ++iter;
  12. }
  13. ++iter;
  14. }
  15. for (auto v : vi)
  16. cout << v << endl;
  17. return 0;
  18. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/178263
推荐阅读
相关标签
  

闽ICP备14008679号