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;
}
};
非淡泊无以明志,非宁静无以致远!