簡體   English   中英

如何按結構中的屬性值對std :: map進行排序

[英]How to sort std::map by property value in struct

我有這樣的結構...

struct MessageLetter{
 char letter;
 int count;
 MessageLetter() {}
 MessageLetter(char letter, int count)
 : letter(letter), count(count)
 {}
};

我用它來創建以下地圖...

std::map<char, MessageLetter> lList;

我想對它進行排序,類似這樣的列表...

bool compare_count(const MessageLetter& first, const MessageLetter& second){
  if(first.count > second.count){
   return true;
  }
  return false;
}

我該怎么做? 我需要使用類似...

bool compare_count(const std::pair <char,MessageLetter>& first, const const std::pair <char,MessageLetter>& second)

您這里有一個相當基本的問題。 std::map始終根據類型(第一個模板參數)進行排序。 您要基於第二個參數(值)進行排序。 根本不支持。

從外觀上看,您要做的是計算消息中字符的頻率,然后按頻率降序將其寫出。

如果是這樣,您確實需要(或至少想要)分三步進行操作:首先計算頻率, 然后按頻率排序,最后打印出排序后的數據。

第一步,我將使用向量:

unsigned max = std::numeric_limits<unsigned char>::max();

std::vector<unsigned> counts(max);

while (infile >> ch)
    ++counts[(unsigned char)ch];

然后,我可能會將數據復制到std::multimap<unsigned, char>以便根據計數對數據進行排序(注意,我們確實希望在此處使用multimap ,因為我們可能有多個具有相同計數的char ) 。

std::multimap<unsigned, char> frequencies;
typedef std::pair<unsigned, char> v_t;

for (unsigned char i=0; i<max; i++)
    frequencies.insert(std::make_pair(i, counts[i]));

最后,按頻率降序寫出結果:

std::copy(frequencies.rbegin(), frequencies.rend(), 
          std::ostream_iterator<v_t>(std::cout, "\n"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM