C ++:按字母顺序排序列表,仅显示第一个和最后一个项目

时间:2013-10-11 21:55:09

标签: c++ sorting

更新:最终版本with <set>without <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;
}

到目前为止我的代码工作正常,因为它按字母顺序显示所有输入的字符串。 (另一方面,我不确定如何在输出本身中显示“结束”。)问题是,程序只应显示(按字母顺序)名字和姓氏< / em>从列表中。我一直在考虑它,我认为我可能不得不从不同的角度处理问题,但我不知道从哪里开始。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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);
   // ...
}

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