评论
# 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
、开开
的说法是的范德萨阿士发送到发送到大夫阿士大夫士大夫士大夫撒大撒的 回复 更多评论