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