C++ 如何在struct中按属性值对std::map排序

C++ 如何在struct中按属性值对std::map排序,c++,map,std,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

我有一个这样的结构

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 std::pair <char,MessageLetter>& first, const const std::pair <char,MessageLetter>& second)
bool比较计数(常数std::pair&first,常数std::pair&second)

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

从外观上看,你要做的是计算消息中字符的频率,然后按频率降序写出它们

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

第一步,我只使用一个向量:

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

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

while (infile >> ch)
    ++counts[(unsigned char)ch];
最后,按频率降序写出结果:

std::copy(frequencies.rbegin(), frequencies.rend(), 
          std::ostream_iterator<v_t>(std::cout, "\n"));
复制(frequencies.rbegin(),frequences.rend(), std::ostream_迭代器(std::cout,“\n”);
您不能对
映射进行排序,它本身保持顺序。因此,您正在创建一个频率为key的映射,因此它根据key correct?进行排序?。我会调查一下,看看是否可以用这个来代替。在我的版本中,我仍然在执行列出的3个步骤,我只是被第二个步骤抓住了,因为我使用的不是你正在做的事情,而是地图。也许地图太夸张了,我可以用一个列表。困难的部分将是确定集合是否已经包含该字母,而不需要对所述列表进行多次迭代。这就是使用地图背后的要点。我是新的C++,所以我会检查你的第一部分,看看它是否工作。你能解释一下多一点…“while(infle>>ch)”我假设infle是字符串。这也存储了我所需要的每个字符,或者仅存储了A-Z和A-Z字符,并遍历了300个字符,或者是相对于62的字符数,这似乎有点极端。@Jackie:是的,这存储了所有(通常是256个)字符。如果你只需要字母,那也很容易处理(尽管通常只需要数一数所有的字母,只打印字母就很容易了)。
while(infle>>ch)
假设从文件读取,但更改为从字符串读取并不重要!我发布的所有东西都有效!如果不是的话,你要么误解了你的问题,要么我故意给你留点东西作为练习。无论如何,不可能是我犯了错误。:-)
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"));