如何在运行时将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,可以参考以下方案:
- 对每个矩形的宽
w、高h,先计算二者的最大公约数g - 将
w/g、h/g组成的最简分数对作为统计键 - 可以直接用
std::map<std::pair<long long, long long>, long long>做频次统计,std::pair默认支持小于比较,可直接适配std::map的排序要求;如果追求更高性能要使用std::unordered_map,自行实现pair的哈希函数即可 - 最后对每个频次
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
相关产品推荐
相关产品推荐

