当前位置: 首页 > 编程笔记 >

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

郑俊美
2023-03-14
本文向大家介绍C++如何删除map容器中指定值的元素详解,包括了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) 。

五、总结

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

 类似资料:
  • 改变原始数组,过滤出指定的值。 返回删除的元素。 使用 Array.filter() 和 Array.includes() 来剔除指定的值。使用 Array.length = 0 将数组中的长度重置为零, 并且通过 Array.push() 只使用 pulled 值重新填充数组。使用 Array.push() 来跟踪 pulled 值。 const pullAtValue = (arr, pull

  • 本文向大家介绍JavaScript从数组中删除指定值元素的方法,包括了JavaScript从数组中删除指定值元素的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript从数组中删除指定值元素的方法。分享给大家供大家参考。具体分析如下: 下面的代码使用了两种方式删除数组的元素,第一种定义一个单独的函数,第二种为Array对象定义了一个removeByValue的方法,调用非

  • 主要内容:使用 delete() 函数从 map 中删除键值对,清空 map 中的所有元素Go语言提供了一个内置函数 delete(),用于删除容器内的元素,下面我们简单介绍一下如何用 delete() 函数删除 map 内的元素。 使用 delete() 函数从 map 中删除键值对 使用 delete() 内建函数从 map 中删除一组键值对,delete() 函数的格式如下: delete(map, 键) 其中 map 为要删除的 map 实例,键为要删除的 map 中键值对的键

  • 问题内容: 我正在构建一个应用程序,其中我从服务器请求一个PHP文件。此PHP文件返回一个以JSONObjects为元素的JSONArray,例如, 我的代码: 如何从此JSONArray删除特定元素? 问题答案: 试试这个代码 编辑: 使用将添加到键和值。所以,用自己

  • 本文向大家介绍java中删除 数组中的指定元素方法,包括了java中删除 数组中的指定元素方法的使用技巧和注意事项,需要的朋友参考一下 java中删除 数组中的指定元素要如何来实现呢,如果各位对于这个算法不是很清楚可以和小编一起来看一篇关于java中删除 数组中的指定元素的例子。 java的api中,并没有提供删除数组中元素的方法。虽然数组是一个对象,不过并没有提供add()、remove()或查

  • 问题内容: 我有一个按钮,并添加了一些按钮: 我可以通过以下方式删除它们: 如果我想一次删除所有侦听器,或者没有函数引用()怎么办?有没有办法做到这一点,或者我必须一个一个地删除它们? 问题答案: 我认为最快的方法是克隆节点,这将删除所有事件侦听器: 请注意,因为这也会清除所涉及节点的所有子元素上的事件侦听器,因此,如果要保留该侦听器,则必须一次显式删除一个侦听器。