如何在struct中按属性值对std :: map进行排序

时间:2013-12-14 16:53:34

标签: c++ map std

我有这样的结构...

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)

1 个答案:

答案 0 :(得分:1)

这里有一个相当基本的问题。 std::map始终基于类型(第一个模板参数)进行排序。您希望基于 second 参数(值)进行排序。这根本就不受支持。

从事物的外观来看,你要做的是计算信息中字符的频率,然后按频率按降序写出来。

如果是这样,你真的需要(或者至少想要)分三步完成:首先计算频率,然后按频率排序,最后打印出已排序的数据。

第一步,我只使用矢量:

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,因为我们可能有多个{{1}具有相同的计数)。

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]));