java vector循环删除元素_STL Vector 的遍历删除. - Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere -...

评论

# re: STL Vector 的遍历删除.

2009-12-08 18:43

唐风

>code3 错误的原因为, vecFiles.erase(it_pos); 当前的it_pos已经被删除

>了, 再下一次循环的时候 it_pos++, 访问非法内存..

>然后回过头来看code1, vecFiles.erase(it_pos++); 在当前的it_pos已经被

>删除的时候, it_pos已经指向下一个位置了. 虽然这里逻辑上是错误的. 但是利

>用c语法的特性产生了一个正确的结果, 算是一个技巧. 不算是一门技术.

我对这种的说法有不同看法:

it_pos无所谓删除不删除,it_pos 的行为就像指针一样,指针本身不会被删除,被删除的是指针指向的内容。我想楼主可能对迭代器失效的理解有偏差(建议在网上查一查相关的资料再看看)

我觉得,code1、2、3没有什么本质区别,都有可能产生迭代器失效的问题。

一个原则:对vector只要做了删除或是增加动作,就要示迭代器已经无效,必须重新从vector对象获取新的迭代器的值,而不能用临时变量、后缀自增等方法……

remove_if+erase的版本才是可读性最好且没什么问题的。

个人愚见,请博主笑纳……

回复  更多评论

# re: STL Vector 的遍历删除.

2009-12-10 10:23

梦芭莎内衣

傻傻的开发的  回复  更多评论

# re: STL Vector 的遍历删除.

2009-12-10 17:45

yisa

code1的做法: 对非连续内存容器是可行的 对连续内存容器是不可取的

code1中会出现漏删 而不是内存越界

回复  更多评论

# re: STL Vector 的遍历删除.

2010-06-25 16:04

glq

@yisa

我用代码验证了下,的确是这样:

欢迎去我的空间讨论交流 hi.baidu.com/bmrs

1 /*

2 DATE: 2010.6.25

3 内容:关于vector的遍历删除

4 任何改变 vector 长度的操作都会使已存在的迭代器失效。例如,在调用 push_back 之后,就不能再信赖指向 vector 的迭代器的值了。

5 */

6 #include

7 #include

8 #include

9 #include

10 using namespace std;

11

12 typedef vector V;

13 typedef vector::iterator VIT;

14 V v1;

15

16

17 int main()

18 {

19 for(int i=0; i<10; ++i)

20 v1.push_back(i);

21

22 VIT it = v1.begin();

23 VIT it2;

24 for(; it!=v1.end(); ++it)

25 cout<

26 cout<

27 VIT it0 = v1.begin()+1; // 1

28 it2 = v1.begin()+3; // 3

29 VIT it3 = it2+1; // 4

30 cout<

31

32 for(it=v1.begin(); it!=v1.end(); ++it)

33 {

34 if(*it == 3)

35 {

36 cout<

37 VIT tmp = it;

38 VIT r = v1.erase(it++);

39 cout<

40 cout<

41 cout<

42 if(r == tmp)

43 cout<

44 break;

45 }

46 }

47

48 cout<

49 return 0;

50 }

回复  更多评论

# re: STL Vector 的遍历删除.

2015-06-12 17:07

、开开

的说法是的范德萨阿士发送到发送到大夫阿士大夫士大夫士大夫撒大撒的  回复  更多评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值