unordered_map
- 构造函数:
std::unordered_map
的构造函数允许您创建空的哈希表,或使用现有容器初始化哈希表。
std::unordered_map<Key, T> myMap; // 创建空的 unordered_map
std::unordered_map<Key, T> myMap(otherMap); // 使用现有的 unordered_map 初始化另一个 unordered_map
- 插入元素:可以使用
insert
方法或直接使用下标操作符[]
来向哈希表中插入元素。
myMap.insert(std::make_pair(key, value)); // 插入键值对
myMap[key] = value; // 直接使用下标操作符插入元素
- 删除元素:可以使用
erase
方法按键删除元素,也可以使用clear
方法删除所有元素。
myMap.erase(key); // 按键删除元素
myMap.clear(); // 删除所有元素
- 查找元素:可以使用
find
方法查找指定键的元素,返回迭代器指向该元素,如果未找到则返回尾后迭代器。
auto it = myMap.find(key); // 查找键为 key 的元素
if (it != myMap.end()) {
// 找到了元素
} else {
// 未找到元素
}
- 大小和容量:可以使用
size
方法获取哈希表中键值对的数量,使用empty
方法检查哈希表是否为空。
int size = myMap.size(); // 获取元素数量
bool isEmpty = myMap.empty(); // 检查是否为空
- 迭代器:可以使用迭代器遍历哈希表中的键值对。
for (auto it = myMap.begin(); it != myMap.end(); ++it) {
// 使用 it->first 访问键,使用 it->second 访问值
}
- 桶相关方法:哈希表内部使用桶来存储元素,可以使用
bucket_count
方法获取桶的数量,使用bucket_size
方法获取指定桶中元素的数量。
int bucketCount = myMap.bucket_count(); // 获取桶的数量
int bucketSize = myMap.bucket_size(bucketIndex); // 获取指定桶中元素的数量
unordered_set
unordered_set
是 C++ 标准库中的一个容器,用于存储唯一的元素集合,其内部实现基于哈希表。下面是一些 unordered_set
常用的方法和操作:
插入元素:
insert(val)
: 将元素val
插入到集合中。如果元素已存在,则插入失败。
unordered_set<int> mySet;
mySet.insert(10);
mySet.insert(20);
删除元素:
erase(val)
: 从集合中删除值为val
的元素。
mySet.erase(10);
查找元素:
find(val)
: 查找值为val
的元素,返回指向该元素的迭代器。如果元素不存在,则返回end()
迭代器。
auto it = mySet.find(20);
if (it != mySet.end()) {
cout << "Element found: " << *it << endl;
}
获取集合大小:
size()
: 返回集合中元素的数量。
cout << "Size of set: " << mySet.size() << endl;
检查集合是否为空:
empty()
: 如果集合为空,则返回true
;否则返回false
。
if (mySet.empty()) {
cout << "Set is empty" << endl;
} else {
cout << "Set is not empty" << endl;
}
遍历集合:
使用迭代器进行遍历:
for (auto it = mySet.begin(); it != mySet.end(); ++it) {
cout << *it << " ";
}
cout << endl;
使用 C++11 新特性的范围循环进行遍历:
for (const auto& elem : mySet) {
cout << elem << " ";
}
cout << endl;
算法题示例
转换条件:lowbit(a[i]+a[j])==a[i]+a[j] 转换为 a[i]+a[j]=2^k
第一个for按顺序枚举a[i],然后第二个for枚举k的所有情况,两层循环中找a[j](即a[i]-2^k)的个数即可
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
// 请在此输入您的代码
int n;
cin>>n;
int nums[n+1];
for(int i = 1;i<n+1;i++){
cin>>nums[i];
}
unordered_map<int,int> map;
long long res = 0;
for(int i = 1;i<n+1;i++){
for(int k = 0;k<=30;k++){
int aj = (1<<k) - nums[i];
if(map.find(aj)!=map.end()){
res += map[aj];
}
}
map[nums[i]]++;
}
cout<<res;
return 0;
}