首页 > 解决方案 > 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";

}

标签: c++

解决方案


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

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

...当与3Sand一起使用时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 

推荐阅读