set和map的区别:set的元素是一个数据,map则是两个元素(一个pair)
unordered_map<type1, type2> 无序映射,是按第一个哈希键来进行检索的。
线性容器:vector、string、list
树形容器:set、multiset、map、multimap
线性模拟树:priority_queue
散列容器:unordered_set、unordered_map
unordered_map 对象创建,代码见下:
#include<iostream>
#include<unordered_map>
using namespace std;
void printUMap(const unordered_map<int, int>& m) {
for (unordered_map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "---------------------------" << endl;
}
int main() {
// 1 默认构造函数
unordered_map<int, int> m1;
cout << "m1: ";
printUMap(m1);
// 2 初始化列表
unordered_map<int, int> m2_1 = {
pair<int, int>(1, 10),
pair<int, int>(5, 13),
pair<int, int>(2, 12),
pair<int, int>(4, 19),
};
cout << "m2_1: ";
printUMap(m2_1);
unordered_map<int, int> m2_2 ({
pair<int, int>(1, 10),
pair<int, int>(5, 13),
pair<int, int>(2, 12),
pair<int, int>(4, 19),
});
cout << "m2_2: ";
printUMap(m2_2);
// 3 迭代器
unordered_map<int, int> m3(m2_1.begin(), m2_1.end());
cout << "m3: ";
printUMap(m3);
// 4 拷贝构造
unordered_map<int, int> m4(m2_2);
cout << "m4: ";
printUMap(m4);
return 0;
}
unordered_map 赋值操作,代码见下
#include<iostream>
#include<unordered_map>
using namespace std;
void printUMap(const unordered_map<int, int>& m) {
for (unordered_map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "---------------------------" << endl;
}
int main() {
// 2 初始化列表
unordered_map<int, int> m1 = {
pair<int, int>(1, 10),
pair<int, int>(5, 13),
pair<int, int>(2, 12),
pair<int, int>(4, 19),
};
cout << "m1: ";
printUMap(m1);
// 1 = 对象
unordered_map<int, int> m2;
m2 = m1;
cout << "m2: ";
printUMap(m2);
return 0;
}
unordered_map 大小操作,代码见下
#include<iostream>
#include<unordered_map>
using namespace std;
void printUMap(const unordered_map<int, int>& m) {
for (unordered_map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "---------------------------" << endl;
}
int main() {
unordered_map<int, int> m;
cout << "empty: " << m.empty() << endl;
cout << "size: " << m.size() << endl;
m = {
pair<int, int>(1, 10),
pair<int, int>(5, 13),
pair<int, int>(2, 12),
pair<int, int>(4, 19),
};
cout << "empty: " << m.empty() << endl;
cout << "size: " << m.size() << endl;
return 0;
}
unordered_map 数据插入,代码见下
#include<iostream>
#include<unordered_map>
using namespace std;
void printUMap(const unordered_map<int, int>& m) {
for (unordered_map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "---------------------------" << endl;
}
int main() {
unordered_map<int, int> m;
// 1
m.insert(pair<int, int>(2, 45));
printUMap(m);
// 2
m.insert(make_pair(4, 56)); // 函数重载
printUMap(m);
// 3
m.insert(unordered_map<int, int>::value_type(5, 78));
printUMap(m);
// 4
m[88] = 6; // 运算符重载
printUMap(m);
// 5
pair<unordered_map<int, int>::iterator, int> ret = m.insert(make_pair(4, 19));
cout << "insert: " << ret.second; // 这里的话,如果是已有的key,就会显示插入失败
// 6
m[5] = 55; // 这种方式的话,就可以直接修改,也会存在下面的第七种情况,第七种方式便不是太好了
// 7
m[0];
printUMap(m);
return 0;
}
unordered_map 数据查找,代码见下
#include<iostream>
#include<unordered_map>
using namespace std;
void printUMap(const unordered_map<int, int>& m) {
for (unordered_map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "---------------------------" << endl;
}
int main() {
unordered_map<int, int> m;
m[1] = 45;
m[3] = 23;
m[6] = 55;
m[2] = 90;
for (int i = 0; i <= 4; ++i) {
unordered_map<int, int>::iterator it = m.find(i);
if (it != m.end()) {
cout << "找到键值对:" << it->first << endl;
}
else {
cout << "未找到键值对" << endl;
}
}
return 0;
}
unordered_map 数据删除,代码见下
#include<iostream>
#include<unordered_map>
using namespace std;
void printUMap(const unordered_map<int, int>& m) {
for (unordered_map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "---------------------------" << endl;
}
int main() {
unordered_map<int, int> m;
m[1] = 45;
m[3] = 23;
m[6] = 55;
m[2] = 90;
// 1
m.erase(2);
printUMap(m);
// 2 迭代器
m.erase(m.begin());
printUMap(m);
// 3
m.erase(m.begin(), m.end());
printUMap(m);
// 4
m[8] = 55;
m[7] = 90;
printUMap(m);
m.clear();
printUMap(m);
return 0;
}
unordered_map 数据修改,代码见下
#include<iostream>
#include<unordered_map>
using namespace std;
void printUMap(const unordered_map<int, int>& m) {
for (unordered_map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "---------------------------" << endl;
}
int main() {
unordered_map<int, int> m;
m[1] = 45;
m[3] = 23;
m[6] = 55;
m[2] = 90;
printUMap(m);
m[3] = 33;
printUMap(m);
m[2]++;
printUMap(m);
return 0;
}
unordered_map 数据统计,代码见下
#include<iostream>
#include<unordered_map>
using namespace std;
void printUMap(const unordered_map<int, int>& m) {
for (unordered_map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "---------------------------" << endl;
}
int main() {
unordered_map<int, int> m;
m[1] = 45;
m[3] = 23;
m[6] = 55;
m[2] = 90;
for (int i = 0; i <= 3; ++i) {
cout << i << "出现次数为:" << m.count(i) << endl;
}
unordered_multimap<int, int> mm = {
pair<int, int>(3, 4),
pair<int, int>(3, 7),
pair<int, int>(2, 3),
pair<int, int>(1, 9),
};
for (int i = 0; i <= 3; ++i) {
cout << i << "出现次数为:" << mm.count(i) << endl;
}
return 0;
}
代码练习 1 对应力扣,四数相加,代码见下
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int, int> hash;
for(int i=0; i<nums1.size(); ++i){
for(int j=0; j<nums2.size(); ++j){
hash[-(nums1[i] + nums2[j])]++;
}
}
int ans = 0;
for(int k=0; k<nums3.size(); ++k){
for(int l=0; l<nums4.size(); ++l){
ans += hash[nums3[k] + nums4[l]];
}
}
return ans;
}
};
代码练习 2 对应力扣和为k的子数组,代码见下
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> cnt;
int ans = 0;
int pre = 0;
cnt[pre]++;
for(int i=0; i<nums.size(); ++i){
pre = pre + nums[i];
ans += cnt[pre - k];
cnt[pre]++;
}
return ans;
}
};