数组c ++中最常见的5个

时间:2013-03-19 13:09:59

标签: c++ arrays random frequency dynamically-generated

嗨,我有一个数组,我希望从这个阵列中获得最常出现的前5名。

static std::string pickRandomStockSymbol()
{
    static std::string stockSymbols[] = {"SIRI", "INTC", "ZNGA", "BBRY", "MSFT", 
        "QQQ", "CSCO", "FB", "MU", "DELL", "AMAT", "NWSA", "AAPL", "AFFY", "ORCL", 
        "YHOO", "GRPN", "MDLZ", "VOD", "CMCSA" };

    return stockSymbols[rand() % 20];

^^这是我将要使用的数组。

使用此结构随机创建事务:

struct Transaction
{
string stockSymbol;     // String containing the stock symbol, e.g. "AAPL"
string buyerName;       // String containing the buyer's name e.g. "Mr Brown"
int buyerAccount;       // Integer containing an eight digit account code
int numShares;          // Integer containing the number of sold shares
int pricePerShare;      // Integer containing the buy price per share
};

在这个功能中,我打算这样做,我只是不知道我采用的方式:

string* Analyser::topFiveStocks()
{

return new string[5];
}

有没有人愿意告诉我如何通过交易来获得前5个出现的元素?

如果需要更多信息,我将非常乐意提供。

先谢谢,安德鲁

3 个答案:

答案 0 :(得分:2)

您可以使用带有股票代码的std::unordered_map作为关键字,并将交易计数作为值。然后将五个最高位置放在std::vector中并返回。

至于将顶部N放在向量中,您可以对其进行排序,并在每次插入后对其进行重新排序,以便具有最高事务计数的库存是第一个。然后很容易看出迭代地图时的当前股票是否具有比向量中的最后一个项目更高的事务计数(这是具有最小事务计数的向量中的项目),然后将其添加到矢量并重新排序。


您也可以将地图中的所有股票添加到矢量中,然后使用地图中的值对其进行排序,并获取矢量中的前五个条目。

这可能是这样的:

using transaction_map_type = std::unordered_map<std::string, unsigned int>;

transaction_map_type transactions;

// ...

std::vector<std::string> topFiveStocks()
{

    std::vector<transaction_map_type::value_type> all_trans;

    // Copy all transaction into our vector
    std::copy(std::begin(transactions), std::end(transactions),
              std::back_inserter(all_trans));

    // Now sort the transactions
    std::sort(std::begin(all_trans), std::end(all_trans),
              [](const transaction_map_type::value_type& t1,
                 const transaction_map_type::value_type& t2)
              { return t1.second > t2.second; });

    // And get the top five (or less) results into a separate vector
    std::vector<std::string> top_five;

    auto count = std::min(5UL, all_trans.size());
    for (unsigned i = 0; i < count; i++)
        top_five.push_back(all_trans[i].first);

    return top_five;
}

另外,请记住,每当进行交易时,都要增加地图中交易的计数器。

注意:此解决方案未经过测试,只是在浏览器中编写。甚至可能无法编译。

答案 1 :(得分:0)

只需对数组进行排序,然后对其进行循环,以计算相等元素的最长间隔。

答案 2 :(得分:0)

累积股票代码:

  • 计入map<string, int>
  • 最高5个符号到set<string>
  • 最高5个符号的最低频率为int
  • 最高5个符号中的最低者为string