0

我正在尝试制作一个程序,它将从用户那里获取数量和单词的列表。但是,我已经完成了所有工作,但无法将数字与同一行中的相应单词组合在一起。它继续输出所有的数字,然后输出所有的单词。单词也应该按字母顺序输出。先感谢您!

{

set<string> sortedItems;
cout <<  " (type \"exit\" to exit, now press enter to begin listing): ";

getline (cin, qtyChoice);
getline(cin, itemChoice);

for (int i = 1; ; i++)
{
string itemChoice;
string wholeOrder;
cout << i << ". ";
cin >> itemChoice;
cin >> qtyChoice; // this is how I got it to take #'s


if (itemChoice == "exit")
{
    break;
}
sortedItems.insert(qtyChoice);
sortedItems.insert (itemChoice);

for_each(sortedItems.begin(), sortedItems.end(), &print);
 return 0;

}

它不是在同一行输出每个的数量和每个的名称,而是这样做:

1. 23 hello
2. 18 thanks
3. 37 goodbye
4. exit
exit
18
23
37
goodbye
hello
thanks
4

1 回答 1

0

您需要结构化数据。目前,您将单词和数量视为完全相同,因此它们打印在单个列表中,单词之前有数字,因为按字母顺序,数字在单词之前。

首先为您的数据创建一个结构

struct LineItem
{
    int quantity;
    string choice;
};

现在与字符串不同,编译器不知道如何对 LineItems 进行排序,您必须通过提供operator<for LineItems 来告诉它。如果第一个 LineItem 小于第二个 LineItem,则 operator< 应该返回 true。我假设(可能是错误的)你想按字母顺序打印选项。所以那将是

bool operator<(const LineItem& x, const LineItem& y)
{
    return x.choice < y.choice;
}

然后将您的集合声明为一组 LineItems

set<LineItem> sortedItems;

然后重写你的输入循环

for (int i = 1; ; i++)
{
    LineItem li;
    cout << i << ". ";
    cin >> li.quantity;
    cin >> li.choice;
    if (li.choice == "exit")
        break;
    sortedItems.insert(li);
}

反正是这样的。您将进行其他更改,例如您的打印例程必须更改为使用 LineItems 而不是字符串,但我将把它留给您。

主要的一点是,通过创建 LineItem 结构,您可以对相关的数据项(数量和选择)进行分组,以便您可以将它们一起打印。

于 2019-01-14T07:20:15.100 回答