哈希表实现
C++ 容器类 <set>
#include <bits/stdc++.h>
using namespace std;int main()
{set<int> myset;int q;cin >> q;while(q--){char c;int num;cin >> c >> num;if(c=='I'){myset.insert(num);}if(c=='Q'){if(myset.find(num)!=myset.end())cout <<"Yes" <<endl;elsecout <<"No" <<endl;}}return 0;
}
#include <bits/stdc++.h>
using namespace std;int main()
{set<int> myset;int q;cin >> q;while(q--){char c;int num;cin >> c >> num;if(c=='I'){myset.insert(num);}if(c=='Q'){if (myset.count(x)) {cout << "YES" << endl;}else {cout << "NO" << endl;}}}return 0;
}
C++ 容器类 <set> | 菜鸟教程
myset.count(x)
是 STL 容器(比如 set
、unordered_set
)中用来判断某个元素是否存在的一种方式。
对于 set
/ unordered_set
来说:
myset.count(x)
返回的是 0
或 1
:
-
0
表示元素x
不在集合中。 -
1
表示元素x
存在于集合中。
注意:set
里面的元素是唯一的,所以不会返回大于 1 的值。
-
set
的底层是 红黑树(平衡二叉搜索树)。 -
每插入一个元素时,会自动检查这个元素是否已经存在。
-
如果存在,就不会插入。
-
C++ 容器类 <map>
C++ 容器类 <map> | 菜鸟教程
#include <bits/stdc++.h>
using namespace std;int main()
{map<int,bool> mymap;int q;cin >> q;while(q--){char c;int num;cin >> c >> num;if(c=='I'){mymap[num]=true;}if(c=='Q'){cout << ( mymap.count(num) ?"Yes":"No" ) << endl;}}return 0;
}#include <bits/stdc++.h>
using namespace std;int main()
{map<int,bool> mymap;int q;cin >> q;while(q--){char c;int num;cin >> c >> num;if(c=='I'){mymap[num]=true;}if(c=='Q'){if(mymap.find(num)!= mymap.end())cout<< "Yes"<<endl;elsecout<< "No"<<endl;}}return 0;
}
map
示例(自动排序):
map<string, int> mp;
mp["apple"] = 5;
mp["banana"] = 3;
mp["orange"] = 7;for (auto& p : mp) {cout << p.first << ": " << p.second << endl;
}
输出:
apple: 5
banana: 3
orange: 7
unordered_map
示例(无序):
unordered_map<string, int> ump;
ump["apple"] = 5;
ump["banana"] = 3;
ump["orange"] = 7;for (auto& p : ump) {cout << p.first << ": " << p.second << endl;
}
输出:顺序不固定
orange: 7
apple: 5
banana: 3
map<string, int> mp;
mp["app"] = 1;
mp["apple"] = 2;
mp["apricot"] = 3;
mp["banana"] = 4;
排序结果:
app
apple
apricot
banana
map<string, int> 会根据字符串的**字典序(lexicographical order)**对键排序,本质上就是按每个字符的 ASCII 值从左到右逐一比较。
-
app
和apple
,前 3 个字符一样,app
更短,所以排前。 -
apple
vsapricot
:前 2 个字符一样,第 3 个是p
(112) vsr
(114),所以apple
<apricot
-
banana
的首字母是b
(98),而前面全是a
(97),所以最后。
示例:按字符串长度排序的 map
#include <bits/stdc++.h>
using namespace std;// 自定义比较器(仿函数)
struct cmp {bool operator()(const string& a, const string& b) const {return a.length() < b.length(); // 长度小的在前}
};int main() {map<string, int, cmp> mymap;mymap["apple"] = 5;mymap["banana"] = 3;mymap["kiwi"] = 10;mymap["pear"] = 2;for (auto& p : mymap) {cout << p.first << ": " << p.second << endl;}return 0;
}
输出结果(按字符串长度从小到大):
kiwi: 10 // 4
pear: 2 // 4
apple: 5 // 5
banana: 3 // 6
struct cmp {bool operator()(const string& a, const string& b) const {return a.length() < b.length();}
};
#include <bits/stdc++.h>
using namespace std;// 普通函数作为比较器
bool cmp(const string& a, const string& b) {return a.length() < b.length();
}int main() {map<string, int, bool(*)(const string&, const string&)> mymap(cmp);mymap["apple"] = 5;mymap["kiwi"] = 10;mymap["banana"] = 3;for (auto& p : mymap) {cout << p.first << ": " << p.second << endl;}return 0;
}
输出结果:
kiwi: 10
apple: 5
banana: 3
先按字符串长度升序,如果长度一样就按字典序升序排列。
#include <bits/stdc++.h>
using namespace std;// 比较器
struct cmp{bool operator()(const string& a ,const string& b) const {if(a.size()==b.size())return a<b;elsereturn a.size() < b.size();}
};int main() {map<string, int,cmp> mymap;mymap["apple"] = 5;mymap["kiwi"] = 10;mymap["pear"] = 8;mymap["grape"] = 6;mymap["banana"] = 3;mymap["mango"] = 7;for (auto& [ zifu , shuzi ] : mymap) {cout << zifu << ": " << shuzi << endl;}return 0;
}
#include <bits/stdc++.h>
using namespace std;// 设定比较器
bool cmp(const string& a, const string& b) {if (a.length() == b.length())return a < b; // 字典序return a.length() < b.length();
}int main() {map<string, int, bool(*)(const string&, const string&)> mymap(cmp);mymap["apple"] = 5;mymap["kiwi"] = 10;mymap["pear"] = 8;mymap["grape"] = 6;mymap["banana"] = 3;mymap["mango"] = 7;for (auto& p : mymap) {cout << p.first << ": " << p.second << endl;}return 0;
}
输出结果:
kiwi: 10
pear: 8
apple: 5
grape: 6
mango: 7
banana: 3
map<string, int, bool(*)(const string&, const string&)> mymap(cmp);
创建一个键为 string
,值为 int
的 map,它的排序规则由我们定义的函数 cmp
控制(通过函数指针传入)。