You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:46:00