[英]Frequency histogram in c++
我是 C++ 的新手。 我正在尝试读取卡片的频率直方图。 当我使用输入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
和3D
一起使用时,它只会比较num_
值,这意味着3 S 自然等于3 D。请注意,当您插入 { 1S
, 2S
, 3S
} 时它将按预期工作。
要解决此问题,您可以修改<
条件以在num_
s 相等时比较_suit
值:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.