-1

更新:最终版本,<set>没有<set>

我一直在解决一个问题:

设计一个程序,询问用户一系列的名字(没有特定的顺序)。输入最后一个人的姓名后,程序应显示按字母顺序排在第一位的姓名和按字母顺序排在最后一位的姓名。

例如,如果用户输入名字 Kristin、Joel、Adam、Beth、Zeb 和 Chris,程序将显示 Adam 和 Zeb。

这是我到目前为止的代码:

#include <iostream>
#include <set>
#include <algorithm>
using namespace std;

void displayOutput(const string& item)
{
    cout << item << endl;
}

int main()
{
    set<string> sortNames;
    string name;

    do {
        cout << "Enter a name (\"end\" to finish):\t";
        cin >> name;

        sortNames.insert(name);
    } while ( name != "end" );

    for_each(sortNames.begin(), sortNames.end(), &displayOutput);

    return 0;
}

到目前为止,我的代码运行良好,因为它按字母顺序显示所有输入的字符串。(附带说明一下,我不知道如何避免“结束”不显示在输出本身中。)问题是,程序只应该显示列表中的(按字母顺序)名字和姓氏。我一直在考虑它,我认为我可能必须从不同的角度来处理这个问题,但我不确定从哪里开始。任何帮助将不胜感激。

4

1 回答 1

2

for_each(sortNames.begin(), sortNames.end(), &displayOutput);遍历整个集合,并为每个项目调用其displayOutput成员函数。

您显然只想displayOutput在第一项sortNames.begin()和最后一项上调用sortNames.rbegin().

抱歉,但由于这显然是家庭作业,我不会给出比这更明确的答案。

至于避免end被展示(并成为收藏的一部分),你有一个基本的逻辑问题。现在,您读取一个名称,将其添加到集合中,然后检查它是否为 ,如果是end,则停止添加更多名称。您可能想要做的是读取一个名称,检查它是否结束,如果不是,则仅将其添加到集合中(如果是,则退出循环)。

我可能会像这样重写代码:

std::string getname() { 
    string name;

    cout << "Enter a name (\"end\" to finish):\t";
    cin >> name;
    return name;
}

int main() {
   std::set<std::string> sortNames;
   std::string name;

   while ((name=getname()) != "end")
       sortNames.insert(name);
   // ...
}

我还要注意,实际上没有必要将所有名称存储在一个集合中。您可以只存储两个字符串,一个是迄今为止看到的按字母顺序排列的第一个字符串,一个是最后一个。当您读取每个字符串时,检查它是否小于第一个(如果是,则将其保存为第一个)。否则,检查它是否大于最后一个(如果是,则将其保存为最后一个)。

于 2013-10-11T22:00:14.467 回答