c++ - c ++中的频率直方图
问题描述
我是 C++ 新手。我正在尝试读取卡片的频率直方图。当我使用 input 执行程序时3D3D3S
,它显示3D
发生 3 次。谁能帮我解释我做错了什么?它只读取数字并忽略卡片的花色。
#include <algorithm>
#include <iterator>
#include <vector>
#include <iostream>
#include <map>
using namespace std;
struct card
{
enum class suit { club, spade, diamond, heart };
enum { ace=1, jack=10, queen=11, king=12 };
using number = int;
number num_;
suit suit_;
};
int main()
{
card mycards;
map<card, unsigned> freqhist;
while(cin >> mycards)
{
auto[pos,is_added] = freqhist.insert({mycards,1});
if (!is_added)
++pos->second;
}
cout << "FreqHist results:\n";
for (auto const& elem : freqhist)
cout << elem.first << " occurs " << elem.second << " times \n";
}
解决方案
std::map
不需要==
运算符来区分唯一性(如果您删除==
定义,您的代码将实际编译)。它完全依赖于<
运营商,这意味着:
bool operator <(card const& a, card const& b)
{
return a.num_ < b.num_;
}
...当与3S
and一起使用时3D
,它只会比较num_
值,这意味着3 S 自然会等于31S
D。请注意,当您插入 { , 2S
, 3S
}时它将按预期工作。
要解决此问题,您可以修改条件以在s 相等时<
比较_suit
值:num_
bool operator <(card const& a, card const& b)
{
if (a.num_ == b.num_) {
return b.suit_ < a.suit_;
}
return a.num_ < b.num_;
}
顺便说一句,你不需要检查返回的值freqhist::insert
来计算频率,你可以简单地这样做:
while(cin >> mycards) {
freqhist[mycards]++;
}
最终运行:
3S3S3D
FreqHist results:
3D occurs 1 times
3S occurs 2 times
推荐阅读
- python - 创建更灵活的功能
- android - Android 8.0 设备上的 JobScheduler API 崩溃
- wampserver - 随机页面在 wamp 服务器中停止工作
- javascript - React Native Fade In Animation 不流畅
- php - 为什么我的登录代码没有从我的数据库中读取?
- css - position: absolute 导致页面溢出
- java - java在类中调用静态方法使该类成为实例化
- php - 检查月份是否大于今天的月份
- spring - 使用 Spring Boot 创建 OAuth 2.0 登录提供程序
- javascript - Ajax 请求不返回 HttpResponse