发布时间:2023-12-29 15:00
vector就是一个模板类,其基类什么也没干vector
这样的声明,只不过是调用了基类的无参构造,它什么也没干。也没有动态分配内存。
如果vector在构造的时候指定容器大小,那么声明时就会申请动态内存,但如果构造是默认构造,并不会申请动态内存。
基类的作用:
分配一个元素为1的空间,将这个元素插入进去,如果后面超出容器所申请的空间,则重新分配一块新的内存空间(其大小为原空间大小的2倍)。
将原内存的元素按着所在顺序全部拷贝到新内存,并把要插入的元素插入到最后一个元素的下一个位置。
调用原内存中的析构函数,销毁原内存。
同上
因为vector具有operator *,operator ++,operator --,operator +=,operator -=,operator -,operator +,opeator->,所以vector的迭代器是随机访问迭代器。
pop_back(), push_back() 尾删,尾插
erase 指定位置删除
clear 全部删除
insert 指定位置插入
[] , at[] 访问,修改元素
迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃).
会引起其底层空间改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、 push_back等
在vector容器中间根据指定迭代器删除元素,也就是调用erase函数,此时因为当前位置会被后面的元素覆盖,所以该指定迭代器会失效,不过此时可以通过erase的返回值重新得到当前位置的正确迭代器;
在vector需重新申请内存的时候,比如扩容,比如释放未使用的内存等等这些过程中都会发生迭代器失效的问题,因为内存有了变动,此时就需要重新获得迭代器;
有人说是不是可以调用reserve(0)来进行释放,毕竟reserve函数会根据我们指定的大小重新申请的内存,那是行不通的哈,这个函数只有在传入大小比原有内存大时才会有动作,否则不进行任何动作。
至于通过resize或者clear等都是行不通的,这些函数都只会对当前已保存在容器中的所有元素进行析构,但对容器本身所在的内存空间是不会进行释放的。
这时我们可以想想,什么情况下vector大小为0呢,就是作为一个空容器的时候,所以要想快速的释放内存,我们可以参考swap函数机制,用一个空的vector与当前vector进行交换,使用形如vector
这样的代码,将v这个vector变量所代表的内存空间与一个空vector进行交换,这样v的内存空间等于被释放掉了,而这个空vector因为是一个临时变量,它在这行代码结束以后,会自动调用vector的析构函数释放动态内存空间,这样,一个vector的动态内存就被迅速的释放掉了。
它的作用是释放掉未使用的内存,假设我们先调用clear函数把所有元素清掉,这样是不是整块容器都变成未使用了,然后再调用shrink_to_fit函数把未使用的部分内存释放掉,那不就把这个vector内存释放掉了吗。