C++中map,multimap和unordered_map的区别

map、multimap容器

map的所有元素都是pair,同时拥有键值(key)和实值(value)

pair的第一元素被视为键值,第二元素被视为实值

性质:

以rb_tree为底层结构,因此元素有自动排序的特性,排序的依据是key;
提供遍历操作和迭代器,正常的++ite遍历,便能得到排序状态;
无法使用map/multimap来改变元素的key,但可以用来改变元素的data。
map元素的key必须独一无二,因此insert()使用的是rb_tree的insert_unique();
multimap元素的key可以重复,因此inset()使用的是rb_tree的insert_equal().



map和multimap:底层实现都是红黑树,所以是有序的,按照key值排序,区别在于map的key值不允许重复,而miltimap的key值可以重复;

unordered_map:key不能重复,无序

添加一道Leetcode题

题目:

给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数。
返回的结果必须要是按升序排好的。

整数 a 比整数 b 更接近 x 需要满足:

|a - x| < |b - x| 或者
|a - x| == |b - x| 且 a < b

示例 1:

输入:arr = [1,2,3,4,5], k = 4, x = 3
输出:[1,2,3,4]

示例 2:

输入:arr = [1,2,3,4,5], k = 4, x = -1
输出:[1,2,3,4]

提示:

1 <= k <= arr.length
1 <= arr.length <= 104
arr 按 升序 排列
-104 <= arr[i], x <= 104

题解:

class Solution {
public:
	vector<int> findClosestElements(vector<int>& arr, int k, int x) {
		// 哈希表,差值的绝对值做key,arr的元素值做value
		// map和multimap:底层实现都是红黑树,所以是有序的,按照key值排序,区别在于map的key值不允许重复,而miltimap的key值可以重复;

    multimap<int,int> m_m;

    for(int i=0;i<arr.size();++i)
    {
        int key = abs(arr[i]-x);
        m_m.insert(make_pair(key,arr[i]));
    }

    vector<int> v;
    multimap<int,int>::iterator it = m_m.begin();
    for(int i=0;i<k; ++i,++it)
    {
        v.emplace_back(it->second);
	//本来想用pair中的get函数的,结果没成功,应该是 get<>(【piar】),  里面的pair不能是迭代器的原因
    }

    sort(v.begin(),v.end());
    return v;
}

};

posted @ 2022-08-25 15:37  虚数五行区  阅读(85)  评论(0编辑  收藏  举报