STL之六:map/multimap用法详解

简介:

map/multimap    

使用map/multimap之前要加入头文件#include<map>,map和multimap将key/value当作元素,进行管理。它们可根据key的排序准则自动将元素排序。multimap允许重复元素,map不允许重复元素。


map和multimap内部的数据结构也是平衡二叉树。


    map和multimap根据元素的key自动对元素进行排序,要修改元素的key必须先删除拥有该key的元素,然后插入拥有新的key/value的元素。

常用函数

1.构造函数和析构函数    

map m:创建空映射,不包含任何元素

map m(op):以op为排序准则,产生一个空的map

map m1(m2):复制c2中的元素到c1中

map m(const value_type *first, const value_type* last):复制[first, last)之间元素构成新映射

map m(const value_type *first, const value_type* last,op):以op为排序准则,复制[first, last)之间元素构成新映射。

m.~set()销毁所有元素,释放内存

multimap mm:创建空映射,不包含任何元素

multimap mm(op):以op为排序准则,产生一个空的multimap

multimap m1(m2):复制m2中的元素到m1中

multimap m(const value_type *first, const value_type* last):复制[first, last)之间元素构成新映射

multimap m(const value_type *first, const value_type* last,op):以op为排序准则,复制[first, last)之间元素构成新映射

m.~multimap()销毁所有元素,释放内存

#include "stdafx.h"
#include <iostream>
#include <map>

using namespace std;

bool fncomp (char lhs, char rhs) {return lhs<rhs;}

struct classcomp {
	bool operator() (const char& lhs, const char& rhs) const
	{return lhs<rhs;}
};

int main ()
{
	map<char,int> first;

	first['a']=10;
	first['b']=30;
	first['c']=50;
	first['d']=70;

	map<char,int> second (first.begin(),first.end());

	map<char,int> third (second);

	map<char,int,classcomp> fourth;                 // class as Compare

	bool(*fn_pt)(char,char) = fncomp;
	map<char,int,bool(*)(char,char)> fifth (fn_pt); // function pointer as Compare

	return 0;
}

2.大小、判断空函数

    int size() const:返回容器元素个数
    bool empty() const:判断容器是否空,若返回true,表明容器已空。

3.增加删除函数

    iterator insert(const value_type& x):插入元素x

    iterator insert(iterator it,const value_type& x):在迭代指针it处插入元素x
    void insert(const value_type *first,const value_type* last):插入[first, last)之间元素

    iterator erase(iterator it):删除迭代指针it处元素

    iterator erase(iterator first,iterator last):删除[first, last)之间元素

    size_type erase(const Key& key):删除键值等于key的元素

#include "stdafx.h"
#include <iostream>
#include <map>

using namespace std;


int main ()
{
	map<char,int> mymap;

	mymap.insert(pair<char,int>('a',10));
	mymap.insert(pair<char,int>('z',200));

	pair<map<char,int>::iterator,bool> ret;
	ret = mymap.insert(pair<char,int>('z',500));
	if (ret.second == false)
	{
		cout<<"element 'z' already existed";
		cout<<"with a value of "<<ret.first->second<<'\n';
	}

	map<char,int>::iterator it = mymap.begin();
	mymap.insert(it,pair<char,int>('b',300));
	mymap.insert(it,pair<char,int>('c',400));

	map<char,int> anothermap;
	anothermap.insert(mymap.begin(),mymap.find('c'));

	cout<<"mymap contains :\n";
	for (it = mymap.begin();it!= mymap.end();it++)
	{
		cout<<it->first<<"=>"<<it->second<<'\n';
	}

	cout<<"anothermap contains :\n";
	for (it = anothermap.begin();it!= anothermap.end();it++)
	{
		cout<<it->first<<"=>"<<it->second<<'\n';
	}
	return 0;
}
上述代码运行结果为

#include "stdafx.h"
#include <iostream>
#include <map>

using namespace std;


int main ()
{
	map<char,int> mymap;
	map<char,int>::iterator it;
	
	mymap['a'] = 10;
	mymap['b'] = 20;
	mymap['c'] = 30;
	mymap['d'] = 40;
	mymap['e'] = 50;
	mymap.insert(pair<char,int>('f',60));

	cout<<"initial mymap contains :\n";
	for (it = mymap.begin();it!= mymap.end();it++)
	{
		cout<<it->first<<"=>"<<it->second<<'\n';
	}

	it = mymap.find('b');
	mymap.erase(it);

	mymap.erase('c');

	it = mymap.find('e');
	mymap.erase(it,mymap.end());

	cout<<"now mymap contains :\n";
	for (it = mymap.begin();it!= mymap.end();it++)
	{
		cout<<it->first<<"=>"<<it->second<<'\n';
	}

	return 0;
}

上述代码运行结果为:


如果想往map/multimap中修改一个映射的值,应先插入一个新映射,再把与修改的映射删除。

4.遍历函数    

    iterator begin():返回首元素的迭代器指针

    iterator end():返回尾元素的迭代器指针

    reverse_iterator rbegin():返回尾元素的逆向迭代器指针

    reverse_iterator rend():返回首元素前一个位置的迭代器指针

5.操作函数   

    const_iterator lower_bound(const Key& key):返回键值大于等于key的迭代器指针
    const_iterator upper_bound(const Key& key):返回键值大于key的迭代器指针
    int count(const Key& key) const:返回键值等于key的元素的个数
    pair<const_iterator,const_iterator> equal_range(const Key& key) const:返回容器中键值等于key的迭代指针[first, last)
    const_iterator find(const Key& key) const:查找功能,返回键值等于key的迭代器指针
    void swap(set& s):交换但映射元素
    void swap(multiset& s):交换多映射元素  

6.特殊函数

    reference operator[](const Key& k):仅在但映射map类中,可以以数组的形式给映射添加键-值对,并可返回值的引用。


相关文章
|
3月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
100 2
|
3月前
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
208 73
|
17天前
|
存储 编译器 容器
set、map、multiset、multimap的介绍及使用以及区别,注意事项
set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列。set当中存储元素的value都是唯一的,不可以重复,因此可以使用set进行去重。set默认是升序的,但是其内部默认不是按照大于比较,而是按照小于比较。set中的元素不能被修改,因为set在底层是用二叉搜索树来实现的,若是对二叉搜索树当中某个结点的值进行了修改,那么这棵树将不再是二叉搜索树。
|
2月前
|
JavaScript 前端开发 开发者
flat、flatmap与map的用法区别
本文介绍了 JavaScript 数组方法 `flat()`、`flatMap()` 和 `map()` 的用法及区别。`flat()` 可按指定深度递归展平数组,参数为深度,默认一层;`flatMap()` 结合了 `map()` 和 `flat()` 功能,返回一维数组,长度可能不同于原数组;而 `map()` 返回与原数组长度一致的新数组。通过多个代码示例展示了三者的功能和差异,帮助开发者更好地理解和使用这些方法。
210 0
|
7月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
156 3
【C++】map、set基本用法
|
11月前
|
存储 算法 C++
【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧
【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧
143 0
|
11月前
|
存储 C++ 索引
C++基础知识(八:STL标准库 Map和multimap )
C++ 标准模板库(STL)中的 map 容器是一种非常有用的关联容器,用于存储键值对(key-value pairs)。在 map 中,每个元素都由一个键和一个值组成,其中键是唯一的,而值则可以重复。
151 0
|
12月前
|
C++ 容器
C++ STL标准库 《map容器详解》
C++ STL标准库 《map容器详解》
77 0
使用 entrySet 遍历 Map 类集合 KV
使用 entrySet 遍历 Map 类集合 KV
|
9月前
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
该文章详细介绍了ES6中Set和Map数据结构的特性和使用方法,并探讨了它们在前端开发中的具体应用,包括如何利用这些数据结构来解决常见的编程问题。
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用