`

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

    博客分类:
  • C++
阅读更多
在我们所熟悉的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;
};
分享到:
评论

相关推荐

    vectory:JavaScript矢量数学库

    vectory是用ES6编写JavaScript向量数学库。 安装 npm install vectory-lib 使用向量,一些例子 首先,您需要加载vectory。 请注意,vectory只是lib的名称,但JavaScript类称为Vector,模块称为vector。 let Vector ...

    丹佛斯VLT系列变频器检修资料.pdf

    丹佛斯VLT系列变频器是丹麦丹佛斯公司生产的工业用变频器产品,广泛应用于各种工业控制系统中。变频器的主要功能是调整电机的供电频率和电压,实现对电机速度的精确控制。在实际应用中,变频器可能会遇到各种故障...

    vectory:后台管理系统模版-vue

    向量这是一个管理项目,是Vue和ant-design-vue框架的基础。项目设置npm install编译和热重装以进行开发npm run serve编译并最小化生产npm run build运行测试npm run test整理和修复文件npm run lint自定义配置请参阅...

    《Vector、ArrayList、List使用深入剖析》-JAVA中文站(www_java-cn_com).htm

    《Vector、ArrayList、List使用深入剖析》-JAVA中文站(www_java-cn_com).htm

    易语言源码易语言求向量长度源码.rar

    总结一下,本压缩包提供的易语言源码实例是关于如何用易语言计算二维或三维向量长度的。通过学习和实践这个源码,用户不仅可以掌握易语言的基本编程技巧,还能巩固数学知识,为后续更复杂的算法和应用打下基础。

    漂亮时钟java完整代码.pdf

    下面是该程序的知识点总结: 一、Java Applet基础知识 * 使用Java.applet包中的Applet类来创建一个Applet程序 * 实现Runnable接口来实现多线程编程 * 使用Thread类来创建线程 二、图形化编程基础知识 * 使用java...

    单相逆变器矢量控制Matlab仿真

    基于单相H桥式逆变器拓扑,搭建了一种基于单相矢量控制的调制技术,供大家参考。

Global site tag (gtag.js) - Google Analytics