map 删除指定元素

原创 2015年11月17日 16:15:14
#include <iostream>
#include<map>
using namespace std;
map<int, int>g_OnMic;
int main()
{
	for (int i = 0; i < 10;i++)
	{
		g_OnMic.insert(make_pair(i, i));
	}
	map<int, int>::iterator iter;
	for (iter = g_OnMic.begin(); iter != g_OnMic.end(); /*iter++*/)
	{
		if (iter->second == 9)
		{
			g_OnMic.erase(iter++);

		}
		else
			iter++;
	}
	return 0;
}<pre name="code" class="cpp">
//另一种删除方式,vector
 std::vector<MessageQueue *>::iterator iter;
    iter = std::find(message_queues_.begin(), message_queues_.end(),
                     message_queue);
    if (iter != message_queues_.end()) {
      message_queues_.erase(iter);
    }
    destroy = message_queues_.empty();

//遍历删除vector中所有元素

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int> m_vecINT = { 1, 2, 3, 4, 5, 6, 7, 8 };
	vector<int>::iterator iter = m_vecINT.begin();
	while (iter!=m_vecINT.end())
	{

		iter = m_vecINT.erase(iter);
	}  
	return 0;
}


关于erase后迭代器失效的原因    ,参考文章分析的特别好

参考文章http://blog.csdn.net/axuan_k/article/details/52588441

//erase操作
#include<vector>
#include<iostream>
using namespace std;
int main(){
    vector<int>q{1,2,3,4,5,6,7,8,9,10};
    int cnt = 0;
    int flag = 0;
    for(vector<int>::iterator i = q.begin(); i != q.end(); ++i){
        ++cnt;
        if(cnt > 15){
            cout<<"gg"<<endl;
            break;
        }
        if(*i == 3)              //删除第三个
           i = q.erase(i);
        cout << *i << endl;
        cout << &(*i) << endl;
    }
    return 0;
}
1
  0xc72158
  2
  0xc7215c
  4
  0xc72160
  5
  0xc72164
  6
  0xc72168
  7
  0xc7216c
  8
  0xc72170
  9
  0xc72174
  10
  0xc72178 

输出结果分析:
当删除第3个元素以后我们发现第四个元素是紧邻第二个元素的(刚好差一个int的内存)
也就是说vector执行erase(i)后会将迭代器i之后的元素逐个向前移动一个type单位
这也就是i及i之后所有迭代器失效的原因…

insert操作(内存不足时)

//insert操作
//内存不够情况
#include<vector>
#include<iostream>
using namespace std;
int main(){

    vector<int>q{1,2,3,4,5,6,7,8,9,10};                                 //  c++11列表初始化
    vector<int>::iterator j = q.begin();
    j++;
    cout<<"第二个元素:"<<*j<<endl;
    cout<<"第二个元素地址:"<<&(*j)<<endl;
    cout<<"初始vector分配的容量:"<<q.capacity()<<endl;                  //  有多少元素即分配多少内存
    int cnt = 0;
    int flag = 0;  //flag保证只插入一次


    for(vector<int>::iterator i = q.begin(); i != q.end(); ++i){
        ++cnt;
        if(cnt > 15){
            cout<< "gg" <<endl;
            break;
        }
        if(*i == 3&&!flag){
            flag = 1;
            i = q.insert(i,22);
            cout<<"\n插入后第二个元素:"<<*j<<endl;
            cout<<"插入后第二个元素地址:"<<&(*j)<<endl;
            cout<<"插入元素后vector分配的容量:" <<q.capacity() <<endl;
        }
        cout << *i << endl;
        cout << &(*i) << endl;
    }
    return 0;
}

Output

第二个元素:2
  第二个元素地址:0xe5215c
  初始vector分配的容量:10
  1
  0xe52158
  2
  0xe5215c

  插入后第二个元素:15007936
  插入后第二个元素地址:0xe5215c
  插入元素后vector分配的容量:20
  22
  0xe52190
  3
  0xe52194
  4
  0xe52198
  5
  0xe5219c
  6
  0xe521a0
  7
  0xe521a4
  8
  0xe521a8
  9
  0xe521ac
  10
  0xe521b0

输出结果分析:
vector内存分配策略为 二倍扩容 , 每次当内存不够的情况下vector会将容量扩展为当前的两倍.
那这些新分配的会在原内存的后面吗? 根据输出结果显然不是的。
上例代码在插入元素22 后, 新的3号元素内存位置距离上一个元素不是4byte(1个int单位), 也就是说
当vector扩容时, 会在另一个内存分配一段新的内存(原内存的二倍). 并把原内存中的元素全部拷贝到新内存中…
指向二号元素的迭代器在插入操作之后指向的值由2变成了15007936,也验证了上述结论.


//insert操作
//内存充足情况
#include<vector>
#include<iostream>
using namespace std;
int main(){

    vector<int>q{1,2,3,4,5,6,7,8,9,10};                             
    q.push_back(11);
    cout<<"初始vector分配的容量:"<<q.capacity()<<endl;                  
    int cnt = 0;
    int flag = 0;  //flag保证只插入一次


    for(vector<int>::iterator i = q.begin(); i != q.end(); ++i){
        ++cnt;
        if(cnt > 15){
            cout<< "gg" <<endl;
            break;
        }
        if(*i == 3&&!flag){
            flag = 1;
            i = q.insert(i,22);
            cout<<"插入元素后vector分配的容量:" <<q.capacity() <<endl;
        }
        cout << *i << endl;
        cout << &(*i) << endl;
    }
    return 0;
}

output:

初始vector分配的容量:20
  1
  0x1f2188
  2
  0x1f218c
  插入元素后vector分配的容量:20
  22
  0x1f2190
  3
  0x1f2194
  4
  0x1f2198
  5
  0x1f219c
  6
  0x1f21a0
  7
  0x1f21a4
  8
  0x1f21a8
  9
  0x1f21ac
  10
  0x1f21b0
  11
  0x1f21b4

输出结果分析:
很显然当内存充足的情况下, 执行insert操作只会将迭代器i及i之后的的所有元素向后移动一个type单位.所以这种情况下即使没有使用返回值也不会发生迭代器失效


                
版权声明:本文为博主原创文章,未经博主允许不得转载。

C++STL:移除map中的元素

移除map中满足条件的元素1、创建mapmap mapTest; mapTest.insert(map::value_type(0, "0")); mapTest.insert(map::value_...
  • wangyao1052
  • wangyao1052
  • 2015年04月19日 22:00
  • 6157

c++ 关于map的遍历 删除

int main(int argc, char* argv[]) { map mapData; mapData["a"] = "aaa"; mapData["b"]...
  • windren06
  • windren06
  • 2012年11月02日 18:36
  • 52887

从map对象中删除元素的操作

1 map.erase(k):删除map中键为k的元素。返回size_type类型的值,表示删除的元素个数; 2 map.erase(p):从map中删除迭代器p所指向的元素。p必须指向map中确实...
  • u012252959
  • u012252959
  • 2015年09月21日 17:33
  • 4095

map删除元素注意,在例三上栽了一次

在STL(标准模板库)中经常会碰到要删除容器中部分元素的情况,本人在编程中就经常编写这方面的代码,在编码和测试过程中发现在STL中删除容器有很多陷阱,网上也有不少网友提到如何在STL中安全删除元素这些...
  • wangandy7811
  • wangandy7811
  • 2009年08月06日 13:19
  • 3213

c++ map删除元素的三种方式

删除键为bfff指向的元素 cmap.erase("bfff"); 删除迭代器 key所指向的元素 map::iterator key = cmap.find("Anna"); if(key...
  • fuck51cto
  • fuck51cto
  • 2016年08月21日 13:58
  • 8596

在map里删除元素

map删除指定元素:     /** 1.HashMap 类映射不保证顺序;某些映射可明确保证其顺序: TreeMap 类     *   2.在遍历Map过程中,不能用map.put(key,ne...
  • shipeng22022
  • shipeng22022
  • 2013年01月17日 15:46
  • 8780

[STL] 从map中删除指定value的元素

从map中删除指定value的元素
  • bearcoding
  • bearcoding
  • 2014年11月20日 11:32
  • 3267

Java Map在遍历过程中删除元素

Java中的Map如果在遍历过程中要删除元素,除非通过迭代器自己的remove()方法,否则就会导致抛出ConcurrentModificationException异常。这么做的原因是为了保证迭代器...
  • u014495327
  • u014495327
  • 2015年01月22日 19:19
  • 7273

C++ map中删除一个元素的处理

截取项目中的部分代码: map IOIDModeMap; map::iterator IOModeMapIter; for (IOModeMapIter= IOIDModeMap.be...
  • liukang325
  • liukang325
  • 2014年03月10日 16:34
  • 8025

Map集合中的方法(添加、删除、判断、获取)

/* Map集合:该集合存储键(K)值(V)对,一对一往里存,而且要保证键的唯一性。 1、添加 put(K key,V value) putAll(Map m) 2、删除 ...
  • u012369373
  • u012369373
  • 2015年11月21日 16:05
  • 14341
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:map 删除指定元素
举报原因:
原因补充:

(最多只允许输入30个字)