C++ primer基础之容器insert

2025-05-27 0 50

C++ primer基础之容器insert

今天学习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,

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 C++ primer基础之容器insert https://www.kuaiidc.com/73657.html

相关文章

发表评论
暂无评论