今天学习C++ 基础知识的时候遇到这样问题,始终出现segments fault。最后才发现原来是自己对“容器insert之后迭代器会失效”的理解不够透彻。
题目如下:
假定iv是一个int的vector,下面的程序存在什么错误?你将如何修改?
?
|
1
2
3
4
5
6
|
auto iter = iv.begin();
auto mid = iv.begin() + iv.size() / 2;
while(iter != mid){
if(*iter == some_val)
iv.insert(iter, 2 * some_val);
}
|
我起初编写的代码如下:
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
/*************************************************************************
> File Name: 9.22.cpp
> Author: wanchouchou
> Mail: 200802376@qq.com
> Created Time: 2014年11月02日 星期日 16时34分20秒
************************************************************************/
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vint = {1,1,1,1,1,3,4,1};
const int val = 1;
auto viBegin = vint.begin();
/*这里需要注意,如果vint.size小于等于1的话,viMid = viBegin 那么就不会进入while循环,所以我们应当单独考虑这种情况*/
auto viMid = vint.begin() + vint.size()/2;
if(vint.empty()){
cout << "This vector is empty!" << endl;
return 0;
}
if(vint.size() == 1){
if(*viBegin == val){
vint.insert(viBegin, 2 * val);
}
goto print;
}
while(viBegin != viMid){
if(*viBegin == val){
vint.insert(viBegin, 2 * val);35 }
++viBegin;
}
print:
auto viEnd = vint.end();
viBegin = vint.begin();
while(viBegin != viEnd){
cout << *viBegin << ", ";
++viBegin;
}
cout << endl;
}
|
运行的时候出现 segmentation faulted.
从逻辑上来讲,应该是没问题啊,那为什么又会出错呢?原来我忘记了对容器进行插入操作的重要影响“除了end之外,所有的迭代器都会失效!!!”。当完成第一次插入之后,此时的viBegin和viMid已经失效了,那么之后对其的所有操作都是非法的。所以我们必须在每一次插入操作之后对两个迭代器重新赋值。鉴于对viMid的赋值比较麻烦,所以采用另外的方式记录当前迭代器是否到达容器的中点,代码如下:
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
/*************************************************************************
> File Name: 9.22.cpp
> Author: wanchouchou
> Mail: 200802376@qq.com
> Created Time: 2014年11月02日 星期日 16时34分20秒
************************************************************************/
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vint = {1,1,1,1,3,4,1};
const int val = 1;
auto viBegin = vint.begin();
/*这里需要注意,如果vint.size小于等于1的话,viMid = viBegin 那么就不会进入while循环,所以我们应当单独考虑这种情况*/
auto mid = vint.size() / 2;
if(vint.empty()){
cout << "This vector is empty!" << endl;
return 0;
}
if(vint.size() == 1){
if(*viBegin == val){
vint.insert(viBegin, 2 * val);
}
goto print;
}
while(distance(viBegin, vint.end()) > mid){
if(*viBegin == val){
viBegin = vint.insert(viBegin, 2 * val);
++viBegin;
}
++viBegin;
}
print:
auto viEnd = vint.end();
viBegin = vint.begin();
while(viBegin != viEnd){
cout << *viBegin << ", ";
++viBegin;
}
cout << endl;
}
|
运行效果如下:
?
|
1
2
|
wanchouchou@wanchouchou-virtual-machine:~/c++/9.*$ ./9.22
2, 1, 2, 1, 2, 1, 2, 1, 3, 4, 1,
|
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关文章
猜你喜欢
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
- 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10
- 64M VPS建站:是否适合初学者操作和管理? 2025-06-10
- ASP.NET自助建站系统中的用户注册和登录功能定制方法 2025-06-10
- ASP.NET自助建站系统的域名绑定与解析教程 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-06-04 15
-
2025-05-25 49
-
2025-05-29 54
-
2025-05-25 67
-
2025-05-25 71
热门评论

