C++ unordered_map基础概念、对象创建、赋值操作、大小操作、数据插入、数据删除、数据修改、代码练习 1 2
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);// 3m.insert(unordered_map<int, int>::value_type(5, 78));printUMap(m);// 4m[88] = 6; // 运算符重载printUMap(m);// 5pair<unordered_map<int, int>::iterator, int> ret = m.insert(make_pair(4, 19));cout << "insert: " << ret.second; // 这里的话,如果是已有的key,就会显示插入失败// 6m[5] = 55; // 这种方式的话,就可以直接修改,也会存在下面的第七种情况,第七种方式便不是太好了// 7m[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;// 1m.erase(2);printUMap(m);// 2 迭代器m.erase(m.begin());printUMap(m);// 3 m.erase(m.begin(), m.end());printUMap(m);// 4m[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;}
};