我是 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";
}
答案 0 :(得分:0)
std::map
不需要 ==
运算符来区分唯一性(如果您删除 ==
定义,您的代码实际上会编译)。它完全依赖于 <
运算符,这意味着:
bool operator <(card const& a, card const& b)
{
return a.num_ < b.num_;
}
...当与 3S
和 3D
一起使用时,它只会比较 num_
的值,这意味着 3S 自然等于 <强>3D.请注意,当您插入 {1S
、2S
、3S
} 时,它会按预期工作。
要解决此问题,您可以修改 <
条件以在 _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