首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++primer.4th.这个地方错了吗解决思路

2012-03-28 
c++primer.4th.这个地方错了吗在该书276页的第4小结:避免存储end 操作返回的迭代器中有如下一段话和程序:“

c++primer.4th.这个地方错了吗
在该书276页的第4小结:避免存储end 操作返回的迭代器中有如下一段话和程序:

 “ 例如,考虑-个读取容器中每个元素的循环,对读出元素做完处理后,在原始元素后面插入
一个新元素。我们希望该循环可以处理每个原始元素,然后使用insert 函数插入新元素,井返
回指向刚插入元素的选代器。在每次插入操作完成后,给返回的迭代器自增L 以使循环定位在
下→个要处理的原始元素。如果我们尝试通过存储end 操作返回的迭代器来"优化"该循环,将
导致灾难性错误:

C/C++ code
vector<int>::iterator first = v.begin() ,las t = v. end ( ); / / cache end iterator/ / diaster: behavior of this loop is unde.卢'nedwhile (first != last) (/ / do some processing/ / insert new value and reassign first , which otherwise would be invalidfirst = v.insert(first , 42);++first; / / advance firstjust past the element we added}

上述代码的行为未定义。在很多实现中,该段代码将导致死循环。问题在于这个程序将end 操作
返回的迭代器值存储在名为last 的局部变量中。循环体中实现了元素的添加运算,添加元素会
使得存储在last 中的迭代器失效。该迭代器既没有指向容器v 的元素,也不再指向V 的超出末
端的下一位置。
为了避免存储end 迭代器,可以在每次做完插入运算后重新计算end 迭代器值:
C/C++ code
/ / safer: recalculate end on each trip whenever the loop adds/erases elementswhile (first != v.end()) (/ / do some processingfirst = v.insert(first , 42); // insertnewvalue++first; / / advance first just past the element we added}

”那个错误代码显然是不对的,但是除了不能存储end操作返回值之外,我觉得还有一个问题。上述代码不能实现其最初的目的,原因在于,insert操作是在指定迭代器之前插入而不是之后,如果insert在指定迭代器之后插入,那么这段代码就没有什么问题。比如,当在最前边插入一个元素的时候,首先处理第一个原始元素,然后插入一个新元素,插入之后,新元素成为了第一个元素,first指针指向了新插入的元素,原来的第一个元素成为了第二个元素,++first显然就又指向了原始第一个元素,而不是我们想要的原始的第二个元素。如此循环,不可能遍历所有的原始元素。
不知道我有没有哪理解错了,还望高手指教。

[解决办法]
哈哈,我也问了相同的问题。我也刚看到这里。

这是我的帖子:
http://topic.csdn.net/u/20120316/22/c70bc3e0-85f8-42f5-bc51-c368409c7804.html
[解决办法]
primer也有几处错误···没看过英文版的。不知道是翻译问题还是什么···
[解决办法]
这里应该是个死循环

热点排行