所以我需要帮助找到名字最多的姓氏。然后我需要打印出名字。我已经得到它打印出每个姓氏的所有名字,但我无法弄清楚如何只打印一个名字最多的名字。
#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;
}
}
}
答案 0 :(得分:0)
您可以从std::max_element
库中致电<algorithm>
。其重载之一有以下形式。
ForwardIt max_element( ForwardIt first, ForwardIt last, Compare comp );
first
和last
以及容器的迭代器,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, " "))