C ++中的频率直方图

时间:2021-02-21 05:32:36

标签: 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";

}

1 个答案:

答案 0 :(得分:0)

std::map 不需要 == 运算符来区分唯一性(如果您删除 == 定义,您的代码实际上会编译)。它完全依赖于 < 运算符,这意味着:

bool operator <(card const& a, card const& b)
{
  return a.num_ < b.num_;
}

...当与 3S3D 一起使用时,它只会比较 num_ 的值,这意味着 3S 自然等于 <强>3D.请注意,当您插入 {1S2S3S} 时,它会按预期工作。

要解决此问题,您可以修改 < 条件以在 _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