vector迭代器失效问题

以下这段话来自《C++标准程序库》—第六章STL容器
“vector迭代器失效发生在下列两种情况
(1)使用者在一个较小索引位置上安插和移除操作
(2)由于容量变化而引起内存分配”
要深刻理解这段话并不容易—-
其实这里迭代器失效的两种情况代表了两种不同的失效含义:
1.当在vector中的某一位置安插(v.insert())或移除(v.erase())某个元素时,且当安插操作时,容器还有一定的容量(v.capacity())来容纳这个元素。如此一来,安插和移除操作不会因容器满而重新分配内存。在安插和移除操作后,作用点位置前的元素并没改变,而操作位置后的元素向后或向前移动一位。因此作用点后的各元素迭代器失效。注意此处的失效只是与安插或移位前定义的迭代器的意图出现稍微偏差。例如安插之前定义了一个逆向迭代器,安插后便无法通过该迭代器遍历所有元素(会丢掉一个元素}。
2.首先,我们知道vector实际上是连续存储的动态数组,因此当容器满时,为了保证连续存储需要重新开辟空间并将其原有数组拷贝到新空间,这使得原来空间的迭代器全部失效。此处的失效会在调试时出现debug assertion failed错误,这是由访问一个野指针而引起。注意vector为其分配内存的机制为:每次当容器满而重新分配内存时,都会分配比所需内存多的空间,因此,大多数安插和移除元素并不会发生内存的重新分配。这在一定程度上优化了vector的效率,避免了每次插入都进行内存重新分配这一耗时的操作。但是,尽管如此,我们也应坚决杜绝使用安插操作前定义的迭代器。
下面通过一个例子来说明迭代器失效的这两种情况。。。

#include<vector>
#include<iostream>
using namespace std;
int main() 
{
    vector<int> v;
    cout << v.size() << " " << v.capacity() << " " << endl;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值