C++进阶 —— multimap

文章介绍了multimap作为关联式容器的特性,它允许key的重复并按key排序。multimap基于pair结构存储键值对,使用make_pair函数创建。文章详细列举了multimap的构造、插入、删除、查找等操作,并提供了一个示例展示如何在multimap中插入、删除和查找元素。
摘要由CSDN通过智能技术生成

目录

一,multimap介绍

类pair

函数模板make_pair

二,multimap使用


一,multimap介绍

  • multimap是关联式容器,按照特定顺序存储键值对<key、value>,其中多个键值对之间的key可以重复;
  • 键key通常用于排序及唯一标识元素,而值value则存储与键key关联的内容;
  • 键key和值value的类型可能不同,且在map的内部,key与value通过成员类型value_type绑定在一起;
typedef pair<const Key, T> value_type;
  • multimap中的元素总是通过其内部比较对象,按照指定的严格弱排序标准对key进行排序的;
  • multimap通过key访问单个元素的速度通常比unordered_multimap容器慢,但使用迭代器直接遍历multimap中的元素可以得到关于key的有序序列;
  • multimap在底层用二叉搜索树(红黑树)来实现;

注:multimap与map唯一不同就是,map中key是唯一的,multimap中key是可以重复的;

类pair

  • 此类将一对值组合在一起,值类型可以不同;
  • pair是tuple的特殊形式;
  • 可直接访问其公共成员变量firstsecond
template <class T1, class T2> struct pair;

函数模板make_pair

  • 用传递的元素,构建一个pair对象;
template <class T1, class T2>
  pair<V1,V2> make_pair (T1&& x, T2&& y);

二,multimap使用

  • multimap中key是可以重复的;
  • multimap中的元素默认将key按照小于来比较;
  • multimap中没有重载operator[]操作;

构造函数

操作函数

//迭代器
      iterator begin() noexcept;
const_iterator begin() const noexcept;
      iterator end() noexcept;
const_iterator end() const noexcept;
      reverse_iterator rbegin() nothrow;
const_reverse_iterator rbegin() const nothrow;
      reverse_iterator rend() nothrow;
const_reverse_iterator rend() const nothrow;

//插入
single element (1)	
    iterator insert (const value_type& val);
    template <class P> iterator insert (P&& val);
with hint (2)	
    iterator insert (const_iterator position, const value_type& val);
    template <class P> iterator insert (const_iterator position, P&& val);
range (3)	
    template <class InputIterator>
    void insert (InputIterator first, InputIterator last);
initializer list (4)	
    void insert (initializer_list<value_type> il);

//删除	
iterator  erase (const_iterator position);
size_type erase (const key_type& k);
iterator  erase (const_iterator first, const_iterator last);

//查找
      iterator find (const key_type& k);
const_iterator find (const key_type& k) const;

bool empty() const noexcept;
size_type size() const noexcept;
size_type count (const key_type& k) const;
void swap (multimap& x);
void clear() noexcept;

key_compare key_comp() const;
value_compare value_comp() const;

      iterator lower_bound (const key_type& k);
const_iterator lower_bound (const key_type& k) const;
      iterator upper_bound (const key_type& k);
const_iterator upper_bound (const key_type& k) const;

pair<const_iterator,const_iterator> equal_range (const key_type& k) const;
            pair<iterator,iterator> equal_range (const key_type& k);
int main()
{
	multimap<string, string> m;
	
	m.insert(pair<string, string>("peach", "桃子")); 
	m.insert(make_pair("banan", "香蕉"));
	m.insert(make_pair("banan", "香蕉"));
	cout << m.size() << endl;
	cout << m.count("banan") << endl;

	for (auto& e : m)
	{
		cout << e.first << "-->" << e.second << endl;
	}

	m.erase("banan");

	multimap<string, string>::iterator it = m.begin();
	while (it != m.end())
	{
		cout << (*it).first << "-->" << (*it).second << endl;
		++it;
	}

	it = m.find("peach");
	cout << (*it).first << "-->" << (*it).second << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值