C++笔记:map键值类型,元素删除

键值类型:

在实现模板时,如果参数用到了map,则常需要使用map的键值类型:

map<K, V>::key_type

在map容器内,用做索引的键的类型 

map<K, V>::mapped_type
在map容器中,键所关联的值的类型 

map<K, V>::value_type

map的值类型:一个pair类型,pair对应的first,second分别对应上面的两个类型


元素删除:

在线性容器中,调用erase删除元素时都会返回删除元素的下一个元素的迭代器;而在关联容器中,调用erase删除元素时是返回void的,通过迭代器删除元素后,迭代器失效,若要重用迭代器,需重新赋值:

#include <iostream>
#include <vector>
#include <deque>
#include <list>
#include <map>

using namespace std;

void testVector()
{
	vector<int> v;
	for(int i=0; i<10; i++)
		v[i] = i;
	
	vector<int>::iterator it = v.begin();
	for(;it != v.end();)
		it = v.erase(it);                //通过对迭代器的重新赋值,而不通过v.erase(it++),因为这样会漏掉元素
	
	for(it=v.begin(); it != v.end(); it++)
		cout<<*it<<endl;
}

void testDeque()
{
	deque<int> d;
	for(int i=0; i<10; i++)
		d[i] = i;
	
	deque<int>::iterator it = d.begin();
	for(;it != d.end();)
	{
		it = d.erase(it);                //通过对迭代器的重新赋值,而不通过d.erase(it++)
		//d.erase(it++);                 //通过这种方式会出现段错误
	}
	for(it = d.begin(); it != d.end(); it++)
		cout<<*it<<endl;
}

void testList()
{
	list<int> l;
	for(int i=0; i<10; i++)
		l.push_back(i);
	
	list<int>::iterator it = l.begin();
	for(;it != l.end();)
	{
		it = l.erase(it);                //通过对迭代器的重新赋值,
		//l.erase(it++);                 //通过在删除前对迭代器进行自增长,两种方式都可以
	}
	for(it = l.begin(); it != l.end(); it++)
		cout<<*it<<endl;
}

void testMap()
{
	map<int, int> m;
	for(int i=0; i<10; i++)
		m.insert(make_pair(i,i));
	
	map<int,int>::iterator it = m.begin();
	for(;it != m.end();)
	{
		m.erase(it++);                 //通过在删除前对迭代器进行自增长,不能通过获取删除后的返回值,因为返回值是void
	}
	for(it = m.begin(); it != m.end(); it++)
		cout<<*it<<endl;
}

之所以不用clear,是因为一般都需要在删除的同时做些其他处理



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值