map
map的特性是,所有元素都会根据键值自动排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一元素被视为键值,第二元素被视为实值。map不允许两个元素拥有相同的键值。
map和list具有某些相同的性质:当客户端对其进行元素新增操作或删除操作时,所有迭代器依然有效,当然,被删除的元素迭代器除外。
创建map
map<int, int> mi; //方式1,创建空map,默认采用less比较
map<int, int> mi0(mi); //方式2,拷贝构造
map<int, int> mi2(mi.begin(), mi.end()); //方式3,通过其它map创建
map<int, int, bool(*)(int, int)> mi3(compare); //方式4,自定义比较函数
map<int, int, comp> mi4; //方式5,传入自定义比较仿函数
bool compare(int val1, int val2){ return val1 < val2; }
struct comp{
bool operator()(const int& val1, const int& val2){ return val1 < val2; }
};
插入操作
mi.insert(make_pair(1, 2)); //方式1,插入一个元素,如果该键值已存在,则插入失败
mi.insert(map<int, int>::value_type(4, 2)); //方式1的另一种写法
mi.insert(mi2.begin(), mi2.end()); //方式2,插入多个元素
mi.emplace(pair<int, int>(2, 2)); //方式3,插入一个元素
mi.emplace_hint(mi.begin(), make_pair(3, 2)); //方式4,在指定位置附近插入一个元素
mi[key] = val; //方式5,插入一个元素,如果该元素已存在,则修改其值
删除操作
mi.erase(2); //方式1,删除某一元素
mi.erase(mi.begin(), ++mi.begin());//方式2,删除指定的多个元素
mi.clear(); //方式3,全部删除
查看操作
mi[key];//方式1,既可以作左值又可以作右值
iter->second;//方式2,利用迭代器返回value
mi.at(key);//方式3,返回key值对应的元素(如果不存在key值,则报异常)
遍历操作
//倒序遍历
for (map<int, int>::reverse_iterator iter = mi.rbegin(); iter != mi.rend(); iter++){
printf("key=%d, val=%d\n", iter->first, iter->second);
}
//利用for_each
for_each(mi.begin(), mi.end(), DoSomething2);
void DoSomething2(const pair<int, int>& val){
printf("key=%d, val=%d\n", val.first, val.second);
}
其它操作
mi.count(2); //返回key为2的个数
mi.empty(); //判断是否为空
mi.find(2); //找到key为2的位置
mi.swap(mi2); //交换
mi.lower_bound(2); //返回第一个能插入元素的位置
mi.upper_bound(2); //返回最后一个能插入元素的位置
mi.equal_range(2); //返回能插入元素的区间
map<int,int>::key_compare keyComp = mi.key_comp();//返回map的key值比较方法
multimap
multimap的特性和用法与map完全相同,唯一的区别是multimap支持键值重复。所以其用法不再赘述。