vector容器insert函数的说明
对于vector中的insert函数,总结几种常用用法,并且对其返回值进行验证,还有一个小的陷阱(迭代器失效问题)首先看在vector中,函数的声明如下:接下来用代码进行验证:int arr[] = {3,4,5};vector<int> v(arr, arr+3);//构造出初始的vectorvector<int>::iterator ite = v.begin(); /
对于vector中的insert函数,总结几种常用用法,并且对其返回值进行验证,还有一个小的陷阱(迭代器失效问题)
首先看在vector中,函数的声明如下:
接下来用代码进行验证:
int arr[] = {3,4,5};
vector<int> v(arr, arr+3); //构造出初始的vector
vector<int>::iterator ite = v.begin(); //迭代器指向vector的开始位置
ite = v.insert(ite, 9); //在ite位置插入一个元素 9, 观察输出, ite指向的元素时9
cout << *ite << endl;
vector<int>::iterator ite2 = ite; //此处ite2用来说明迭代器失效问题
++ite2;
++ite2;
ite = v.insert(ite, 3, 1); //在ite位置插入三个1, 观察输出,ite指向的元素是 1
cout << *ite << endl;
cout << *ite2 << endl; //次数ite2 指向的是元素4
int in[] = {100, 100}; //在ite位置插入一个区间,同样输出ite指向的元素,发现变成了区间第一个元素 100
ite = v.insert(ite, in, in+2);
cout << *ite << endl;
for(; ite!=v.end(); ++ite){ //最后输出所有的元素:100 100 1 1 1 9 3 4 5
cout << *ite << " ";
}
运行结果如下:
运行过程中,发现迭代器ite始终指向的是vector的第一个位置,即指向的位置不变。因为在vector的insert函数实现细节上,基本思想是将插入点后的元素依次往后移动,留出来要插入的元素的空间,将插入元素放进去,所以迭代器指向的位置不会发生变化。当然在函数具体的实现细节上还要考虑很多,比如当前的备用空间是否能全部容纳要插入的元素,还要考虑实现的效率。这里有一个大家容易忽略的问题,当vector重新申请了内存以后,之前所有的迭代器都会失效。迭代器ite2是根据ite向后移动了两个位置,在插入三个1之前,指向元素4,但是当插入了三个1之后,因为vector重新申请了空间,但是ite2还是指向原来的位置,此时就发生错误。
————————————————
版权声明:本文为CSDN博主「ddou_pan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ddou_pan/article/details/79784302
更多推荐
所有评论(0)