更新:最终版本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>从列表中。我一直在考虑它,我认为我可能不得不从不同的角度处理问题,但我不知道从哪里开始。任何帮助将不胜感激。
答案 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);
// ...
}
我还注意到,确实没有必要将所有名称存储在一个集合中。你可以只存储两个字符串,其中一个字符串是迄今为止按字母顺序排列的字符串,另一个字符串是最后一个字符串。当您读取每个字符串时,请检查它是否小于第一个字符串(如果是,则将其另存为第一个字符串)。否则,检查它是否大于最后一个(如果是,则将其保存为最后一个)。