set和map都是一种关联式容器,它们通常都是语言标准库内置的,其有以下操作:
插入
s.insert()
查找
if(s.find(nums2[i]) != s.end()) //找到的情况
删除
s.erase(10) //删除10号元素
修改 change (map专有)
set有以下特性
- 所有元素只有key没有value
- 不允许出现重复值
- 所有的元素都会被自动排序
- 不能通过迭代器来改变set的值,因为set的值就是键,但可以访问
leetcode题目
给定两个数组,编写一个函数来计算它们的交集。
示例
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
代码
#include<iostream>
#include<vector>
#include<set>
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
set<int> record;
for(int i=0; i<nums1.size(); i++){
record.insert(nums1[i]);
}
set<int> result;
for(int i=0; i<nums2.size(); i++){
if(record.find(nums2[i]) != record.end())
result.insert(nums2[i]);
}
vector<int> res;
//使用迭代器访问set
for(set<int>::iterator iter = result.begin(); iter != result.end(); iter++)
res.push_back(*iter);
return res;
}
};
map有以下特性
- 所有元素都是键 + 值存在
- 键不允许重复,键都会有个对应值
- map的键是不能修改的,但是其键对应的值是可以修改的
map遍历键值
map<int, int> record;
for(map<int>::iterator iter = record.begin(); iter != record.end(); iter++){
//first是键, second是值
cout<<iter->first<<" "<<iter->second<<endl;
}
leetcode题目
给定两个数组,编写一个函数来计算它们的交集,数组元素可能重复。
示例
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
代码
#include<iostream>
#include<vector>
#include<map>
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
map<int, int> record;
for(int i=0; i<nums1.size(); i++)
record[nums1[i]]++;
vector<int> res;
for(int i=0; i<nums2.size(); i++){
if(record[nums2[i]] > 0){
res.push_back(nums2[i]);
record[nums2[i]]--;
}
}
return res;
}
};