[C++][经验总结]vectory迭代器(iterator)失效

在我们所熟悉的STL中,vector有自己的一套分配策略。

1)当vector被创建的时候,vector会根据用户的设置进行分配内存;通常申请的内存空间是制定值的两倍;
2)当vector插入数据的时候,如果内存空间不足,它会自动重新申请一块内存(2倍于当前大小),然后把原来的内存内容拷贝到新的内存中区,最后在释放原来的内存空间;
3)动态释放内存就导致一个问题的出现,那就是迭代器失效,因为vector已经偷偷的把地址给换了;

所以我们使用迭代器的原则是:
(1)尽量不做写的工作;
(2)不可避免使用写工作的时候,在做完写工作的同时必须重新初始化迭代器;

这部分是测试代码:

typedef vector<string> NameVec;

class TestForVector
{
public:
TestForVector(unsigned int size = 5)
:mSize(size>5 ? size:5)
{
mNameVec.reserve(size);
OutPutVectorySize(string("TestForVector()"));
}

void insertFullItems()
{
string name("name");
char tmp[128]="";

OutPutVectorySize(string("insertFullItems()->begin"));

for (unsigned int i = 0; i< mSize; i++)
{
name.clear();
_itoa(i+1, tmp, sizeof(tmp));

name.append("name ");
name.append(tmp);

mNameVec.push_back(name);
}

OutPutVectorySize(string("insertFullItems()<-end"));
}

void TestForInvalidVectorIterator()
{
NameVec::const_iterator itr = mNameVec.begin()+1;// point to the second element
cout << "1)The address of itr is 0x"<< hex << &(*itr) << "context is: " << *itr << endl;

OutPutVectorySize(string("TestForInvalidVectorIterator()->begin"));
mNameVec.push_back(string("one more name"));
OutPutVectorySize(string("TestForInvalidVectorIterator()<-end"));

NameVec::const_iterator itr2 = mNameVec.begin()+1;// point to the second element
cout << "2)The address of itr is 0x"<< hex << &(*itr2) << "context is: " << *itr2 << endl;

//the memory of mNameVec has been re-allocated, so the context of itr has been removed
//Crash
cout << "3)The address of itr is 0x"<< hex << &(*itr) << "context is: " << *itr << endl;
}
private:
void OutPutVectorySize(string funName)
{
cout<<"[TestForVector]:"<<funName.c_str()<<" mNameVec size = " << mNameVec.capacity() << endl;
}

private:
NameVec mNameVec;
unsigned int mSize;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值