繁体   English   中英

c++ 中的频率直方图

[英]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_;
}

...当与3S3D一起使用时,它只会比较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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM