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

如何在运行时将std::ratio存入std::unordered_map等STL容器

关于能否将std::ratio存入STL容器的解答

核心结论

不能直接将std::ratio作为STL容器的元素或键类型使用,也无法基于它实现你需要的运行期比例统计需求。

原因说明

  • std::ratio是C++标准库提供的编译期分数类型,本质是模板类型,分子、分母都是编译期常量参数,std::ratio<1,2>代表的是一个类型,不是可以赋值、传递的运行期对象,不符合STL容器对元素类型的基础要求。
  • 就算你实例化std::ratio类型的对象,它是无数据成员的空类,运行期无法获取到分子、分母的数值,也没有默认实现哈希、相等比较等容器键所需的接口,你尝试定义的std::unordered_map<std::ratio, int>语法层面就无法通过编译。

可互换矩形统计问题的实现方案

你需要实现的最简比例统计需求,不需要用到std::ratio,可以参考以下方案:

  1. 对每个矩形的宽w、高h,先计算二者的最大公约数g
  2. 将w/g、h/g组成的最简分数对作为统计键
  3. 可以直接用std::map<std::pair<long long, long long>, long long>做频次统计,std::pair默认支持小于比较,可直接适配std::map的排序要求;如果追求更高性能要使用std::unordered_map,自行实现pair的哈希函数即可
  4. 最后对每个频次cnt,累加cnt * (cnt - 1) / 2即为符合要求的矩形对总数

参考代码片段:

#include <vector>
#include <map>
#include <numeric>

using namespace std;

long long interchangeableRectangles(vector<vector<int>>& rectangles) {
    map<pair<long long, long long>, long long> freq;
    long long res = 0;
    for (auto& rect : rectangles) {
        long long w = rect[0], h = rect[1];
        long long g = gcd(w, h);
        freq[{w / g, h / g}]++;
    }
    for (auto& entry : freq) {
        long long cnt = entry.second;
        res += cnt * (cnt - 1) / 2;
    }
    return res;
}

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:15:00