list、vector使用erase()时需要注意的地方 您所在的位置:网站首页 vector的erase用法 list、vector使用erase()时需要注意的地方

list、vector使用erase()时需要注意的地方

2024-05-31 04:45| 来源: 网络整理| 查看: 265

先说一下两者的优缺点吧。

list与vector的区别

vector相当于一个数组。     在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacituy()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储,这给人以vector可以不指定vector即一个连续内存的大小的感觉。通常此默认的内存分配能完成大部分情况下的存储。    优点:(1) 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组                     进行动态操作。通常体现在push_back() pop_back()                (2) 随机访问方便,即支持[ ]操作符和vector.at()                (3) 节省空间。    缺点:(1) 在内部进行插入删除操作效率低。                (2) 只能在vector的最后进行push和pop,不能在vector的头进行push和pop。                (3) 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放 。

 list(双向链表)     每一个结点都包括一个信息快Info、一个前驱指针Pre、一个后驱指针Post。可以不分配必须的内存大小方便的进行添加和删除操作。使用的是非连续的内存空间进行存储。    优点:(1) 不使用连续内存完成动态操作。                (2) 在内部方便的进行插入和删除操作                (3) 可在两端进行push、pop    缺点:(1) 不能进行内部的随机访问,即不支持[ ]操作符和vector.at()                (2) 相对于verctor占用内存多。

 

问题情景

分别使用vector、list容器实现对1, 4, 3, 7, 9, 3, 6, 8, 3, 3, 5, 2, 3, 7的存入,并且删除其中所有的3,最后输出显示剩下的数字。

面对这个问题,喵哥首先想到的是用erase删除,那么在list和vector中使用erase一样么?

vector使用erase

vector使用erase删除元素,其返回值指向下一个元素,但是由于vector本身的性质(存在一块连续的内存上),删掉一个元素后,其后的元素都会向前移动,所以此时指向下一个元素的迭代器其实跟刚刚被删除元素的迭代器是一样的。

图中的1001、1002~……表示内存地址的关系。

一下是喵哥的解决方案:

#include #include using namespace std; int main() { int a[] = {1, 4, 3, 7, 9, 3, 6, 8, 3, 3, 5, 2, 3, 7}; vector vector_int(a, a + sizeof(a)/sizeof(int)); /*方案一*/ // for(int i = 0; i < vector_int.size(); i++) // { // if(vector_int[i] == 3) // { // vector_int.erase(vector_int.begin() + i); // i--; // } // } /*方案二*/ // for(vector::iterator itor = vector_int.begin(); itor != vector_int.end(); ++itor) // { // if (*itor == 3) // { // vector_int.erase(itor); // --itor; // } // } /*方案三*/ vector::iterator v = vector_int.begin(); while(v != vector_int.end()) { if(*v == 3) { v = vector_int.erase(v); cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有