vector::erase()返回下一个iter:

STL中的源码:

//清除[first, last)中的所有元素
iterator erase(iterator first, iterator last)
{
iterator i = copy(last, finish, first);  //[last, finish)拷贝到first
destroy(i, finish);
finish = finish - (last - first);
return first;
}
//清除某个位置上的元素
iterator erase(iterator position)
{
if(position + 1 != end())
copy(position + 1, finish, position);
--finish;
destroy(finish);
return position;
}

用法:

for(vector<int>::iterator it = vecInt.begin(); it != vecInt.end();)
{
if(*it == 0)
{
it = vecInt.erase(it);
}
else
{
it++;
}
}

vector.clear()

  vector中存储了对象的指针,调用clear后,并不会调用这些指针所指对象析构函数,因此要在clear之前调用delete;   

  如果vector存储的是对象,调用clear后,自建类型的对象(int之类的)直接删除,若是外部类型,则调用析构函数。

看个vector内存分配的例子:

class Test
{
public:
Test(int x1): x(x1) { cout << "Test cons" << x << endl; }
~Test() { cout << "Test des" << x << endl; }
int x;
};
int main()
{
vector<Test> vec;
Test* p1 = new Test(1);
Test* p2 = new Test(2);
Test* p3 = new Test(3);
vec.push_back(*p1);
vec.push_back(*p2);
vec.push_back(*p3); vec.clear();
system("pause");
return 0;
}

输出:

这里析构了6次,原因是vector的容量永远是大于或者等于size。而当内存不够的时候,会重新allocate新的内存,拷贝数据,deallocate当前内存,;

这里内存变化是1->2->4,所以析构次数是1+2+3=6次。

map::erase()没有返回下一个iter:

(1) void erase (iterator position) { t.erase(position); }
(2) size_type erase (const key_type& x) { return t.erase(x); }
(3) void erase (iterator first, iterator last) { t.erase(first, last); }

用法:

for(map<int,int>::iterator it = mapInt.begin(); it != mapInt.end();)
{
if(it->second == 0)
{
mapInt.erase(it++);
}
else
{
it++;
}
}

vector.erase();vector.clear();map.erase();的更多相关文章

  1. map::erase陷阱

    map::erase函数在不同版本stl中的差异 1. C++98和C++11标准 http://www.cplusplus.com/reference/map/map/erase/ 2. pj st ...

  2. JAVA中的数据结构——集合类(线性表:Vector、Stack、LinkedList、set接口;键值对:Hashtable、Map接口<HashMap类、TreeMap类>)

    Java的集合可以分为两种,第一种是以数组为代表的线性表,基类是Collection:第二种是以Hashtable为代表的键值对. ... 线性表,基类是Collection: 数组类: person ...

  3. STL学习:STL库vector、string、set、map用法

    本文仅介绍了如何使用它们常用的方法. vector 1.可随机访问,可在尾部插入元素:2.内存自动管理:3.头文件#include <vector> 1.创建vector对象 一维: (1 ...

  4. STL中vector、list、deque和map的区别

    1 vector     向量 相当于一个数组    在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...

  5. 关于map::erase的使用说明

    C++ 中经常使用的容器类有vector,list,map.其中vector和list的erase都是返回迭代器,但是map就比较不一样. 当在循环体中使用map::erase语句时,为了能够在任何机 ...

  6. 【转】STL中vector、list、deque和map的区别

    1.vector 向量 相当于一个数组 在内存中分配一块连续的内容空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数 ...

  7. C++ STL基本容器的使用(vector、list、deque、map、stack、queue)

    1.关联容器和顺序容器 C++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector.list.deque等.关联容器主要有map和set.如下图: 1.vector基本使用 #incl ...

  8. [转] C++ STL中map.erase(it++)用法原理解析

    总结一下map::erase的正确用法. 首先看一下在循环中使用vector::erase时我习惯的用法: for(vector<int>::iterator it = vecInt.be ...

  9. struts2:OGNL表达式,遍历List、Map集合;投影的使用

    OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存 ...

随机推荐

  1. 在Windows上使用Docker 创建MongoDB 副本集的极简方法(翻译)

    这篇博客介绍下在Windows上使用Docker 创建MongoDB 三节点副本集的最简单的方法.以下命令需要Docker for Windows并使用Linux 容器. 1: 为每个节点创建数据卷 ...

  2. ZK(ZooKeeper)分布式锁实现

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你. 本文中案例都会在上传到git上,请放心浏览 git地址:https://github.com/muxiaonong/Zo ...

  3. Vue CLI 5 和 vite 创建 vue3.x 项目以及 Vue CLI 和 vite 的区别

    这几天进入 Vue CLI 官网,发现不能选择 Vue CLI 的版本,也就是说查不到 vue-cli 4 以下版本的文档. 如果此时电脑上安装了 Vue CLI,那么旧版安装的 vue 项目很可能会 ...

  4. kivy 选择框

    from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.lang import builder # 注册 ...

  5. the Agiles Scrum Meeting 11

    会议时间:2020.4.20 20:00 1.每个人的工作 在这次例会上,我们对上周完成的工作进行了总结. 本周已完成的工作 个人结对项目增量开发组 tq: 创建广播功能 修复纯英文数字可能溢出bug ...

  6. Linux线程互斥学习笔记--详细分析

    一.互斥锁 为啥要有互斥? 多个进程/线程执行的先后顺序不确定,何时切出CPU也不确定. 多个进程/线程访问变量的动作往往不是原子的. 1. 操作步骤 (1)创建锁 // 创建互斥锁mutex pth ...

  7. 洛谷 P2680 [NOIP2015 提高组] 运输计划

    链接:P2680 题意: 在树上把一条边边权变为0使得最长给定路径最短 分析: 最大值最小可以想到二分答案,对于每一个mid,寻找所有大于mid的路径,再寻找是否存在一条边使得删去它后大于mid的路径 ...

  8. set prompt = "任意匹配字符" 当前目录详解

    转载:https://blog.csdn.net/alexdream/article/details/6865730 研究了两天的FreeBSD,总是感觉输入提示符那里怪怪的,而且默认的提示符还不带显 ...

  9. 批量免密ssh

    参考连接:https://www.cnblogs.com/xiaoyuxixi/p/11413355.html 适用于所有密码都一样的情况下 应用场景: 在应用ansible的实际情况中,有一个很现实 ...

  10. kafka的安装

    kafka是基于java环境的,所以需要先安装java环境 centos:yum install java-11-openjdk ubuntu:apt install default-jdk 默安装默 ...