C++如何删除map容器中指定值的元素详解

前言

大家都知道map容器是C++ STL中的重要一员,平时会遇到删除map容器中value为指定元素的问题,例如删除所有字符串为"123"或者能整除3的元素。

一、map容器下的方法说明

由于map容器下的方法较多,这里只列举代码中用到的几个方法:

insert()方法:

//插入val到pos的后面,然后返回一个指向这个元素的迭代器
iterator insert( iterator pos, const pair<KEY_TYPE,VALUE_TYPE> &val );
//插入start到end的元素到map中
void insert( input_iterator start, input_iterator end );
//只有在val不存在时插入val。返回值是一个指向被插入元素的迭代器和一个描述是否插入的bool值
pair<iterator, bool> insert( const pair<KEY_TYPE,VALUE_TYPE> &val );

erase()方法:

//erase()函数删除在pos位置的元素,或者删除在start和end之间的元素,或者删除那些值为key的所有元素
void erase( iterator pos );
void erase( iterator start, iterator end );
size_type erase( const KEY_TYPE &key );

iterator迭代器。

二、删除map容器中指定的字符串

下面代码中map容器的value对应的是一个string类型的指针,在初始化时类似于string *p = new string("123");

/**
 * @FileName map_del_str.cpp
 * @Describe A simple example for deleting an element of string in map.
 * @Author  vfhky 2016-06-26 10:26 https://typecodes.com/cseries/mapdelintstring.html
 * @Compile  g++ map_del_str.cpp -o map_del_str
 * @Reference
 */
#include <iostream>
#include <map>

using namespace std;
#define TOTAL 10
#define DEL_STR "123"

/**
 * 删除map中所有元素为str的数据
 */
void fun( map<int, string *> &map1, const string str )
{
 map<int, string *>::iterator it;
 int i_Total = 0;
 for( it=map1.begin(); it!=map1.end(); )
 {
  if( *(it->second) == str )
  {
   /**
    * 123 123 123 123 123 123 123 123 123 123
    */
   cout << *(it->second) << " ";

   //一定要先释放内存的控制
   delete it->second;
   it->second = NULL;

   //再删除迭代
   map1.erase(it++);
   ++i_Total;
  }
  else
  {
   it++;
  }
 }

 //i_Total=[10]
 cout << endl << "i_Total=[" << i_Total << "]" << endl;
}

int main( int argc, char **argv )
{
 map<int, string *> map1;

 //初始化map1
 for( int i=0; i<TOTAL; i++ )
 {
  map1.insert( pair<int, string *>(i,new string("123")) );
  //map1[i] = new string("123");
 }

 //删除为DEL_STR的元素
 fun( map1, DEL_STR );

 //查看最后的数据
 map<int, string *>::iterator it1;
 for( it1=map1.begin(); it1!=map1.end(); ++it1 )
 {
  cout << "map1[" << it1->first << "]=[" << *(it1->second) << "]" << endl;
 }
 return 0;
}

效果如下图所示:

三、删除map容器中指定的整型数据

下面代码中map容器的value对应的是一个int数据,在初始化时可以直接使用map1[i] = i语句。

/**
 * @FileName map_del_int.cpp
 * @Describe A simple example for deleting an element of interger in map.
 * @Author  vfhky 2016-06-26 10:26 https://typecodes.com/cseries/mapdelintstring.html
 * @Compile  g++ map_del_int.cpp -o map_del_int
 * @Reference
 */
#include <iostream>
#include <map>

using namespace std;
#define TOTAL 100
#define DEL_INT 3

/**
 * 删除map中所有值整除NUM的元素
 */
void fun( map<int,int> &map1, const int NUM )
{
 map<int, int>::iterator it;
 int i_Total = 0;
 for( it=map1.begin(); it!=map1.end(); )
 {
  if( it->second % NUM == 0 )
  {
   /**
    * 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
    */
   cout << it->second << " ";
   map1.erase(it++);
   ++i_Total;
  }
  else
  {
   it++;
  }
 }
 cout << endl << "i_Total=[" << i_Total << "]" << endl;
}

int main( int argc, char **argv )
{
 map<int, int> map1;

 //初始化map1
 for( int i=0; i<TOTAL; i++ )
 {
  map1.insert(pair<int, int>(i,i));
  //map1[i] = i;
 }

 //删除整除3的元素
 fun( map1, DEL_INT );

 //查看最后的数据
 map<int, int>::iterator it1;
 for( it1=map1.begin(); it1!=map1.end(); ++it1 )
 {
  cout << "map1[" << it1->first << "]=[" << it1->second << "]" << endl;
 }
 return 0;
}

效果如下图所示:

四、附录

STL容器分顺序容器Sequence Container(包含vector,deque,list容器)和关联容器Associative Container(包含set,multiset,map,multimap容器)。C++标准中,Sequence Container的erase函数会返回iterator,但Associative Container不返回iterator。所以在小节2、小节3中使用map1.erase(it++)而不是直接map1.erase(it)

五、总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 浅谈c++ vector和map的遍历和删除对象

    示例如下: // Aa.cpp : Defines the entry point for the console application. #include "stdafx.h" #include <vector> #include <map> #include <iostream> using namespace std; int main(int argc, char* argv[]) { printf("Hello World!\n

  • c++ map,mutimap删除问题分析

    这样删除会导致程序内存覆盖等一系列不可预知的bug 复制代码 代码如下: map<string, string>::iterator iter; for ( iter = mm.begin();iter != mm.end(); iter ++ ) { if ( iter->second == something ) { mm.erase( iter ); } } 原因:当erase掉iter后,继续执行iter++,这个时候就乱套了 正确方法: 复制代码 代码如下: for (iter

  • C++中vector和map的删除方法(推荐)

    1.连续内存序列容器(vector,string,deque) 序列容器的erase方法返回值是指向紧接在被删除元素之后的元素的有效迭代器,可以根据这个返回值来安全删除元素. vector<int> c; for(vector<int>::iterator it = c.begin(); it != c.end();) { if(need_delete()) it = c.erase(it); else ++it; } 2.关联容器(set,multiset,map,multima

  • C++如何删除map容器中指定值的元素详解

    前言 大家都知道map容器是C++ STL中的重要一员,平时会遇到删除map容器中value为指定元素的问题,例如删除所有字符串为"123"或者能整除3的元素. 一.map容器下的方法说明 由于map容器下的方法较多,这里只列举代码中用到的几个方法: insert()方法: //插入val到pos的后面,然后返回一个指向这个元素的迭代器 iterator insert( iterator pos, const pair<KEY_TYPE,VALUE_TYPE> &v

  • PHP删除数组中指定值的元素常用方法实例分析【4种方法】

    本文实例讲述了PHP删除数组中指定值的元素.分享给大家供大家参考,具体如下: 测试数组如下: //这是一个测试数组 $testArr = array( 't' => 'qq', 'q' => 'qq', 'b' => 'baidu', 'a' => 'ali', 'm' => 'xiaomi' ); 方法一: //foreach遍历后unset删除,这种方法也是最容易想到的方法 function delByValue($arr, $value){ if(!is_array($

  • c++容器list、vector、map、set区别与用法详解

    c++容器list.vector.map.set区别 list 封装链表,以链表形式实现,不支持[]运算符. 对随机访问的速度很慢(需要遍历整个链表),插入数据很快(不需要拷贝和移动数据,只需改变指针的指向). 新添加的元素,list可以任意加入. vector 封装数组,使用连续内存存储,支持[]运算符. 对随机访问的速度很快,对头插元素速度很慢,尾插元素速度很快 新添加的元素,vector有一套算法. map 采用平衡检索二叉树:红黑树 存储结构为键值对<key,value> set 采用

  • Java集合类之Map集合的特点及使用详解

    目录 1.Map集合概述和使用 1.1 Map集合概述 1.2 Map集合常用方法 1.3 Map集合的遍历 1.Map集合概述和使用 1.1 Map集合概述 java.util接口 Map<K,V> 类型参数: K - 此映射所维护的键的类型 V - 映射值的类型 public interface Map<K,V> 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口. Map 是一

  • docker容器的几种存储详解

    目录 写在前面 几种存储挂载方式 1.bind mounts 2.volumes 3.tmpfs mount 存储数据共享 写在前面 我们在上篇学习了容器网络,对容器网络驱动bridge工作原理做了较为详细的介绍,今天小作文一起看看容器中另一个关键域-存储. 容器的存储可以分为两大类: 一种是与镜像相关的即我们在<docker容器技术基础之联合文件系统OverlayFS>一文提到的容器层Copy-On-Write特性.默认情况下,在容器内创建的所有文件都存储在可写容器层上,这种直接将文件存储在

  • Kotlin中的惰性操作容器Sequence序列使用原理详解

    目录 Sequence序列 执行的顺序 只做最少的操作 序列可以是无限的 序列不会在每个步骤创建集合 Sequence的基本使用 序列的创建 序列的操作 Sequence源码分析 Sequence是什么? 序列的创建方式分析 序列的惰性原理 总结 Sequence序列 Sequence 是Kotlin标准库提供的一种容器类型.它和Iterable一样具备对集合进行多步骤操作能力,但是却是采用了一种完全不同于Iterable的实现方式: val map = (0..3).filter { prin

  • git 删除分支和回滚的实例详解

    git 删除分支和回滚的实例详解 [git 删除本地分支] git branch -D br [git 删除远程分支] git push origin :br (origin 后面有空格) git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id [本地代码库回滚]: git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除 git reset --hard HEAD~3:将最近3次的提交回滚 [远程代码

  • Java中map遍历方式的选择问题详解

    1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的只是key的集合,针对每个key,都要去Map中额外查找一次value,从而降低了总体效率.那么实际情况如何呢? 为了解遍历性能的真实差距,包括在遍历key+value.遍历key.遍历value等不同场景下的差异,我试着进行了一些对比测试. 2. 对比测试 一开始只进行了简单的测试,但结果却表明k

  • Python中pandas dataframe删除一行或一列:drop函数详解

    用法:DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False) 在这里默认:axis=0,指删除index,因此删除columns时要指定axis=1: inplace=False,默认该删除操作不改变原数据,而是返回一个执行删除操作后的新dataframe: inplace=True,则会直接在原数据上进行删除操作,删除后就回不来了. 例子: >>>df = pd.DataFrame(np.a

  • element中el-container容器与div布局区分详解

    用于布局的容器组件,方便快速搭建页面的基本结构: el-container:外层容器.当子元素中包含 或 时,全部子元素会垂直上下排列,否则会水平左右排列. el-header:顶栏容器. el-aside:侧边栏容器. el-main:主要区域容器. el-footer:底栏容器. 以上组件采用了 flex 布局,elemen-ui官方文档链接: http://element-cn.eleme.io/#/zh-CN/component/container 此外,el-container 的子元

随机推荐