【博客26】STL容器:end()迭代器不要提前保存!!!!

内容: 今天记录一种,在循环式中,每次我们都要调用end()来判断是否到达边界,那么我们是否可以提前将end()给保存下来,不用每次都去调用呢?答案是:最好不要,除非你保证循环式中不会改变容器大小的操作,否则这将是一种非常危险的行为。我喜欢通过代码来演示,下面给出代码。

代码:
在这里插入图片描述
运行结果:
在这里插入图片描述
分析:代码中,我们发现插入少了4,所有我们希望找到3的位置,然后插入4,不要说我傻,可以直接find然后插入,这还不是为了演示嘛哈哈。好,回归正传,代码中我们事先把end先保存下来,以为接下来可以直接使用,而不需要每次都去调用end()来获取迭代器,然而这样的结果就是,在循环式中插入4之后,原来end迭代器失效,导致最后程序跑飞了。

建议:使用容器时,end迭代器是非常容易因为插入删除元素而导致变化的,所以尽量不要采取先保留下来的方法,因为这样你得小心去留意有没有地方在原始end使用之前改变了它,你将会花费很多精力。同时,对于其他的迭代器也最好不好采取保存下来的形式,除非是关联容器,比如:map这种,因为它的底层是红黑树,所以更改其他节点不影响本节点的迭代器,但是若是vector,一旦扩容,则基本所有迭代器失效,或者deque你在中间插入元素,也是所有迭代器失效,这样你再使用你之前保存的迭代器,将会有未知的行为。

大三学生一枚,文章均非抄袭或者模仿,均为原创,仅代表个人观点,如果文章有错误的地方,欢迎在下方提出,每条评论我都会去认真看并回复,同时感谢指正的前辈。

猜你喜欢

转载自blog.csdn.net/qq_43684922/article/details/89475952