vector容器的insert函数

对于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还是指向原来的位置,此时就发生错误。




猜你喜欢

转载自blog.csdn.net/ddou_pan/article/details/79784302