C++primer 9.3.6节练习

练习9.31

有两点原因,第一是因为list和forward_list不能执行运算符操作,第二是forward_list有自己独特的insert和erase;

 1 #include <deque>
 2 #include <string>
 3 #include <iterator>
 4 #include <forward_list>
 5 
 6 using namespace std;
 7 
 8 
 9 int main()
10 {
11     forward_list<int> vi = { 0,1,2,3,4,5,6,7,8,9 };
12     auto curr = vi.begin();
13     auto prev = vi.before_begin();
14     while (curr != vi.end())
15     {
16         if (*curr % 2)
17         {
18             prev = curr;                                //尤其注意这里关于prev和curr的指向,他的前驱不能再添加元素前实现2级跳,不然程序结果会出错,prev要始终保证是curr的前驱
19             curr = vi.insert_after(curr, *curr);
20             ++curr;
21             ++prev;
22         }
23         else
24         {
25             curr = vi.erase_after(prev);
26         }
27     }
28     for (auto c : vi)
29         cout << c << endl;
30     system("pause");
31     return 0;
32 }

练习9.32

这种语句是非法的,因为当输入函数插入数据时,iter的值可能是原始值或原始值+1,甚至是其它值,这依赖于编译器。

*和++的优先级相同,不要让编译器做选择

练习9.33

当是vector、list、deque等时程序会崩溃,因为插入元素后迭代器失效,继续操作迭代器是未定义操作,会导致程序崩溃。

当是list或者forward_list时,程序会隔一个数添加一个元素;

练习9.34

死循环,如果++iter在while循环体内的话,则程序永远在原容器的第一个元素前面添加一个自己的拷贝元素,如果iter不在循环体内,则程序是无限在容器头添加一个元素;

想要让程序正常运行至结束,需要这样修改:

 1 #include<iostream>
 2 #include<vector>
 3 #include<list>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     list<int> vec{ 0,1,2,3,4,5,6,7,8,9 };
10     auto begin = vec.begin();
11     while (begin != vec.end())
12     {
13         if (*begin % 2)
14         {
15             begin = vec.insert(begin, *begin);
16             ++begin;
17         }
18         ++begin;
19     }
20 
21     for (auto c : vec)
22         cout << c << endl;
23     system("pause");
24     return 0;
25 }

 

posted @ 2017-08-10 21:40  五月份小姐  阅读(330)  评论(0)    收藏  举报