键值类型:

在实现模板时,如果参数用到了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,是因为一般都需要在删除的同时做些其他处理



Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐