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 }
浙公网安备 33010602011771号