如何解决C++ ordered_set编译时pb_ds头文件缺失错误
解决MinGW下pb_ds ordered_set编译缺失头文件的问题
问题根源
MinGW的GCC 9.2.0发行版未完整包含ext/pb_ds组件的所有实现头文件,导致编译时找不到hash_standard_resize_policy_imp.hpp,这是MinGW打包时的常见疏漏。
可行解决方案
1. 更换完整的MinGW发行版
改用MinGW-w64(而非旧版MinGW)的官方完整发行版,比如通过MSYS2安装的mingw-w64-gcc,它会完整提供ext/pb_ds的所有依赖文件:
- 在MSYS2环境中执行安装命令:
安装完成后切换到该编译器环境重新编译代码即可。pacman -S mingw-w64-x86_64-gcc
2. 手动补全缺失的头文件
若不想更换编译器,可从完整的GCC 9.x源码中提取缺失文件:
- 找到GCC源码中
libstdc++-v3/include/ext/pb_ds/detail/resize_policy/路径下的hash_standard_resize_policy_imp.hpp文件。 - 将文件复制到本地MinGW对应目录:
c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\ext\pb_ds\detail\resize_policy\,确保目录结构完全匹配。
3. 标准库替代方案(仅当不需要pb_ds扩展功能时)
如果不需要order_of_key、find_by_order这类pb_ds专属功能,可直接用标准库的std::set替代,它本身就是有序容器,用法更通用且无需额外头文件。
正确的ordered_set使用示例
确保代码的命名空间和模板声明规范:
#include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; template <typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; int main() { ordered_set<int> os; os.insert(1); os.insert(3); os.insert(5); // 获取元素的排名(小于该元素的元素个数) int rank = os.order_of_key(3); // 返回1 // 获取第k个元素(从0开始计数) auto it = os.find_by_order(1); // 指向元素3 return 0; }
内容的提问来源于stack exchange,提问作者Harsh jain
相关产品推荐
相关产品推荐

