找到地图中的最大集合

时间:2018-03-26 03:09:59

标签: c++ set maps

所以我需要帮助找到名字最多的姓氏。然后我需要打印出名字。我已经得到它打印出每个姓氏的所有名字,但我无法弄清楚如何只打印一个名字最多的名字。

#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;
    }
  }
 }

2 个答案:

答案 0 :(得分:0)

您可以从std::max_element库中致电<algorithm>。其重载之一有以下形式。

 ForwardIt max_element( ForwardIt first, ForwardIt last, Compare comp );

firstlast以及容器的迭代器,comp是用于比较两个元素的比较函数对象。有关详细信息,请查看cppreference页面http://en.cppreference.com/w/cpp/algorithm/max_element

#include <algorithm>

auto largest = std::max_element(
    lnames.begin(), lnames.end(), [](auto const& p1, auto const& p2) {
        return p1.second->size() < p2.second->size();
    });

for (auto const& name : *largest->second)
    std::cout << name << '\t';

答案 1 :(得分:0)

我强烈建议您在此使用multimap<string, string> lnames。您可以像这样填充它:

for(string fn, ln; cin >> fn >> ln;) {
    lnames.insert(make_pair(ln, fn));
}

然后只使用multimap::upper_bound的迭代器来找到最大的:

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;
    }
}

最后输出这个只需使用ostream_iterator s:

copy(max_start, max_finish, ostream_iterator<string>(cout, " "))