STL总结之multimap

介绍

multimap 是一个封装红黑树 (自平衡二叉树) 的关联容器。容器中每个元素都是 key/value,其中 key 为排序对象。每个 key 可重复出现。
multimap 可被当做 字典 使用。
multimap 定义于头文件 <map> 中,其声明如下:

template<
    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T> >
> class multimap;

multimap 容器是一个类。
multimap 容器存储元素都是 key/value (键值对)。

初始化

multimap 容器需要指定排序规则,有两种方式可指定:

  • 元素类型重载小于号运算符。
    strcut T {
    	…… // 各种参数
    	// 该函数声明必须这样写
    	friend bool operator <(const T& a,const T& b)
    	{
    		// check(a,b)为 a < b 成立条件
    		return check(a,b) ? true : false;
    	}
     };
    
  • 以 类型参数 定义,需要定义一个 函数对象。如 set<T,greater<T> >
    struct Cmp {
    	bool operator()(const T& a,const T& b)
    	{	
    	    // check(a,b)为 a < b 成立条件
    		return check(a,b) ? true : false;
    	}
    };
    
    class Cmp {
    public:
    	bool operator()(const T& a,const T& b)
    	{	
    	    // check(a,b)为 a < b 成立条件
    		return check(a,b) ? true : false;
    	}
    };
    
    // 这两个 Cmp 是等价的
    multimap<int,Cmp> s;
    

以下构造函数都不涉及定义排序规则,均采用默认排序规则——升序。

  • multimap<T,T> mmp;
    创建一个空的 multimap 容器。
    multimap<int,string> mmp;
    
  • multimap<T,T> mmp({{num1.key,num1.value},{num2.key,num2.value},……});
    创建一个以初值列元素为初值的 multimap 容器。
    multimap<int,string> mmp({{0,"zero"},{1,"one"}});
    
  • multimap<T,T> mmp = {{num1.key,num1.value},{num2.key,num2.value},……};
    创建一个以初值列元素为初值的 multimap 容器。
    multimap<int,string> mmp = {{0,"zero"},{1,"one"}};
    
  • multimap<T,T> mmp(mmp1);
    创建一个 mmp1 的同型拷贝 (所有元素都被复制)。
    multimap<int,string> mmp1 = {{0,"zero"},{1,"one"}};
    multimap<int,string> mmp(mmp1);
    
  • multimap<T,T> mmp = mmp1;
    创建一个 mmp1 的同型拷贝 (所有元素都被复制)。
    multimap<int,string> mmp1 = {{0,"zero"},{1,"one"}};
    multimap<int,string> mmp = mmp1;
    
  • multimap<T,T> mmp(begin_iterator,end_iterator);
    创建一个以迭代器区间为 [begin_iterator,end_iterator) 作为元素初值的 multimap 容器。
    multimap<int,string> mmp1 = {{0,"zero"},{1,"one"}};
    multimap<int,string> mmp(mmp1.begin(),mmp1.end());
    

修改

multimap 容器禁止修改元素内容。
multimap 容器提供了一种使用迭代器访问元素的方法。

multimap<int,string>::iterator ite;
for(;ite != mmp.end(); ++ite)
{
   cout << "键:"  << (*ite).first << endl;
   cout << "值:" << (*ite).second << endl;
}

查询

  • empty()
    判断 multimap 容器是否为空。
  • size()
    返回 multimap 容器中的元素个数。
  • max_size()
    返回 multimap 容器大小的理论极限值,即当前内存情况下,允许创建 multimap 容器中元素个数的最大可能值。
  • count(key)
    返回 multimap 容器中键值为 key 的元素个数。
  • find(key)
    判断 multimap 容器中是否存在键值为 key 的元素,存在返回其中任意一个迭代器,否则返回 end()

比较

按照字典序列比较 multimap 中的值。

  • operator ==
  • operator !=
  • operator <
  • operator <=
  • operator >
  • operator >=
if(mmp == mmp1)
{
	cout << "mmp == mmp1" << endl;
}

增加

增加元素,需要传递键值对。在 map 容器中,通常构造 pair<> 进行传递。

  • operator[]
    这是一种特殊的添加元素方法,而且也是平时使用次数比较多的方法。
    multimap<int,string> mmp;
    mmp[0] = "zero";
    mmp[1] = "one";
    
  • insert(pair<T,T>())
    multimap 容器中插入一个元素,返回新插入元素的迭代器位置。
    insert(pair<int,string>(5,"five"));
    
  • insert(begin_iterator,end_iterator)
    multimap 容器中迭代器区间 [start_iterator,end_iterator) 内的所有元素,无返回值。
    multimap<int,string> mmp1 = {{0,"zero"},{1,"one"}};
    multimap<int,string> mmp = {{0,"hhh"}};
    mmp.insert(mmp1.begin(),mmp1.end());
    // 此时 mmp 容器元素依次为:{0,,"hhh"},{0,"zero"},{1,"one"}
    

删除

  • clear()
    清空 map 容器。
  • erase(pos_iterator)
    移除 multimap 容器指定迭代器位置 pos_iterator 的元素。
    multimap<int,string> mmp = {{0,"zero"},{1,"one"}};
    mmp.erase(mp.begin());
    // 此时 map 容器元素依次为:{0,"zero"}
    
  • erase(begin_iterator,end_iterator)
    移除 multimap 容器指定迭代器位区间 [begin_iterator,end_iterator) 中的所有元素。
    multimap<int,string> mmp = {{0,"zero"},{1,"one"}};
    mmp.erase(mmp.begin(),++mmp.begin());
    // 此时 multimap 容器元素依次为:{0,"zero"}
    
  • erase(key)
    移除 multimap 容器中键值为 key 的元素 (如果存在的话)。返回值表示移除元素个数。

其他操作

  • equal_range(key)
    返回键值等于 key 的迭代器区间。
    其返回值为 pair<multimap<T,T>::iterator,multimap<T,T>::iterator>multimap<T,T>::iterator指向第一个元素键值等于 key 的迭代器位置,第二个multimap<T,T>::iterator 指向最后一个元素键值等于 key 迭代器位置的下一个位置。
    multimap<int,string> mmp = {{0,"zero"},{1,"one"}};
    pair<multimap<int,string>::iterator,multimap<int,string>::iterator> result = mmp.equal_range(0);
    
  • lower_bound(key) / upper_bound(key)
    返回首个元素值 ≥ k e y \ge key key 的元素迭代器位置。
    返回首个元素值 &gt; k e y &gt; key >key 的元素迭代器位置。
    两者返回值刚好构成 equal_range() 的返回值。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值