C++ unordered_map / map中,key/val的类型问题。

背景

在做Leetcode49_字母异位词分组时,定义哈希表

unordered_map<vector<int>, vector<string>> mp;

报错:错误    C2280    “std::_Uhash_compare<_Kty,_Hasher,_Keyeq>::_Uhash_compare(const std::_Uhash_compare<_Kty,_Hasher,_Keyeq> &)”: 尝试引用已删除的函数 

然而将unordered_map改为map

map<vector<int>, vector<string>> mp;

编译通过并得到了正确结果。


结论

unordered_map<vector<int>, vector<string>> mp;//这种用法是错误的!!!

unordered_map 作为一种无序结构,其内部实现是哈希表。

这就要求key的类型是必须是可哈希的,一般来说是一些简单的类型比如int,string。复杂类型,如vector、pair,没有提供对应的哈希函数,需要自己提供一下哈希函数。

然而,哈希表的val可以是其他复杂类型。可以用一个哈希表记录多种内容,而不必使用多个。

map<vector<int>, vector<string>> mp;//这种用法是正确的

map 作为一种有序结构,其内部实现是红黑树(更高级的二叉搜索树)。

既然用到红黑树就必须得有比较两个元素大小的方法,所以vector<int>和pair<int,int>可以直接作为key进行使用。



找了好久终于找到了报错原因,码字不易,谢谢访问。

### C++ 中多线程环境下访问 `unordered_map` 是否需要加锁 在 C++ 的多线程环境中,`std::unordered_map` 并不是线程安全的容器。这意味着如果多个线程同时对同一个 `std::unordered_map` 实例进行读写操作,则可能会引发数据竞争或未定义行为[^1]。 当只有一个线程执行修改操作(如插入、删除),而其他线程仅执行只读操作时,理论上不需要额外的同步机制来保护 `std::unordered_map` 的一致性。然而,在实际应用中,为了防止潜在的竞争条件以及确保程序的行为可预测,通常建议使用某种形式的同步控制措施,即使是在这种情况下也应如此[^2]。 对于涉及并发修改的情况——即存在至少两个线程可能同时尝试改变同一份 `std::unordered_map` 数据结构的内容时,必须采取适当的锁定策略或其他同步技术以保障其安全性。常见的做法包括但不限于: - 使用标准库提供的互斥量 (`std::mutex`) 配合 RAII 模式的工具类如 `std::lock_guard<std::mutex>` 来自动管理资源生命周期内的上锁与解锁过程。 ```cpp #include <iostream> #include <thread> #include <vector> #include <unordered_map> #include <mutex> std::unordered_map<int, int> sharedMap; std::mutex mtx; void insertElement(int key, int value){ std::lock_guard<std::mutex> lock(mtx); // 自动获取并释放锁 sharedMap[key] = value; } int main(){ std::vector<std::thread> threads; for (int i=0;i<10;++i){ threads.emplace_back(insertElement,i,i*2); } for(auto& th : threads){ if(th.joinable()) th.join(); } for(const auto &pair : sharedMap){ std::cout << pair.first << ": " << pair.second << "\n"; } } ``` 另一种方式则是通过引入更高级别的抽象概念比如读者写者模式下的共享互斥体(`std::shared_mutex`) ,允许更高的并发度从而提升整体效率[^3]: ```cpp #include <iostream> #include <thread> #include <vector> #include <unordered_map> #include <shared_mutex> std::unordered_map<int,int> data; std::shared_mutex rw_mtx; // 只读操作 void readData(int key){ std::shared_lock<std::shared_mutex> lock(rw_mtx); if(data.find(key)!=data.end()){ std::cout<<"Read: "<<key<<": "<<data.at(key)<<'\n'; }else{ std::cout<<"Key not found.\n"; } } // 修改操作 void writeData(int key, int val){ std::unique_lock<std::shared_mutex> lock(rw_mutex); data[key]=val; std::cout<<"Write: "<<key<<": "<<val<<"\n"; } ``` 综上所述,在多线程场景下访问 `std::unordered_map` 时确实有必要实施相应的同步手段来规避风险;具体采用哪种方案取决于应用场景的具体需求及性能考量等因素.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值