C++ 在地图中查找最大集

C++ 在地图中查找最大集,c++,set,maps,C++,Set,Maps,所以我需要帮助找到姓氏和名字最多的人。然后我需要打印出名字。我已经把每个姓的名字都打印出来了,但是我不知道怎么只打印出名字最多的那个 #include <stdio.h> #include <iostream> #include <string> #include <set> #include <map> using namespace std; typedef set <string> fnset; main() {

所以我需要帮助找到姓氏和名字最多的人。然后我需要打印出名字。我已经把每个姓的名字都打印出来了,但是我不知道怎么只打印出名字最多的那个

#include <stdio.h>
#include <iostream>
#include <string>
#include <set>
#include <map>
using namespace std;

typedef set <string> fnset;

main()
{
  map <string, fnset *> lnames;
  map <string, fnset *>::iterator lnit;
  fnset *fnames;
  fnset::iterator fnit;
  string fn, ln;

  while (cin >> fn >> ln) {
    lnit = lnames.find(ln);
    if (lnit == lnames.end()) {
       fnames = new fnset;
       lnames.insert(make_pair(ln, fnames));
    } else {
      fnames = lnit->second;
    }
    fnames->insert(fn);
   }

   for (lnit = lnames.begin(); lnit != lnames.end(); lnit++) {    
    fnames = lnit->second;
    for (fnit = fnames->begin(); fnit != fnames->end(); fnit++) {
        cout << *fnit << endl;
    }
  }
 }
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
打字机;
main()
{
地图名称;
迭代器lnit;
fnset*fnames;
迭代器fnit;
字符串fn,ln;
而(cin>>fn>>ln){
lnit=lnames.find(ln);
if(lnit==lnames.end()){
fnames=新的fnset;
lnames.插入(配对(ln,fnames));
}否则{
fnames=lnit->second;
}
fnames->插入(fn);
}
对于(lnit=lnames.begin();lnit!=lnames.end();lnit++){
fnames=lnit->second;
对于(fnit=fnames->begin();fnit!=fnames->end();fnit++){

cout您可以从
调用
std::max\u元素

#包括
自动最大=标准::最大元素(
lnames.begin(),lnames.end(),[](自动常量和p1,自动常量和p2){
返回p1.second->size()size();
});
用于(自动常数和名称:*最大->第二)

std::cout我强烈建议在此处使用。您可以这样填充它:

for(string fn, ln; cin >> fn >> ln;) {
    lnames.insert(make_pair(ln, fn));
}
然后使用迭代器查找最大值:

auto max_start = cbegin(lnames);
auto max_end = cbegin(lnames);
size_t max_distance = 0U;

for(auto it_start = cbegin(lnames), it_finish = cbegin(lnames); it_start != cend(lnames); it_start = it_finish) {
    it_finish = lnames.upper_bound(it_finish->first);

    auto it_distance = distance(it_start, it_finish);

    if(it_distance > max_distance) {
        max_distance = it_distance;
        max_start = it_start;
        max_finish = it_finish;
    }
}
最后,只需使用s即可输出:

copy(max\u start,max\u finish,ostream\u迭代器(cout,”))

看起来你把这件事弄得太复杂了。为什么映射中的值通过typedef指向一组字符串?一个简单的
映射
就足够了。最后,你不需要嵌套循环,只需要一个循环就可以找到映射中哪个键对应于集合中条目最多的值,然后是第二个循环pri你要知道一个姓和名字的地图(姓氏是关键),你要查找名字最多的姓氏,请注意,有效的C++只定义了<代码>主()/CUT>,它返回<代码> int <代码>
for(string fn, ln; cin >> fn >> ln;) {
    lnames.insert(make_pair(ln, fn));
}
auto max_start = cbegin(lnames);
auto max_end = cbegin(lnames);
size_t max_distance = 0U;

for(auto it_start = cbegin(lnames), it_finish = cbegin(lnames); it_start != cend(lnames); it_start = it_finish) {
    it_finish = lnames.upper_bound(it_finish->first);

    auto it_distance = distance(it_start, it_finish);

    if(it_distance > max_distance) {
        max_distance = it_distance;
        max_start = it_start;
        max_finish = it_finish;
    }
}
copy(max_start, max_finish, ostream_iterator<string>(cout, " "))