创建我的收藏夹列表
Posted
技术标签:
【中文标题】创建我的收藏夹列表【英文标题】:Creating a list of my favorites 【发布时间】:2016-08-01 20:57:10 【问题描述】:我正在创建的 C++ 应用程序允许用户在列表中添加或删除他们最喜欢的游戏。
我希望对列表进行排序。
-
塞尔达传说
反对
侠盗猎车手V
我知道我需要使用 while/for 循环,但是我正在使用我是新手的向量,而且我不知道在我的代码中将 while/for 循环放在哪里。
到目前为止我尝试过的是:
尝试 1 失败 - 嵌套的 for 循环:
for (gameInter = list.begin(); gameInter != list.end(); gameInter++)
for (int listNum = 1; listNum < list.size(); listNum++)
cout << listNum << ". " << *gameInter << endl;
尝试 2 失败 - while 循环:
case 1:
while(listNum < list.size())
cout << "Type the game title to add: \n";
cin.get();
getline(cin, addGame);
list.push_back(addGame);
sort(list.begin(), list.end());
cin.clear();
cin.sync();
cout << "\nYour game was successfully added.\n";
listNum++;
break;
完整代码:
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int main()
int userSelection = 0;
int listNum = 1;
string addGame, removeGame;
vector<string> list;
vector<string>::iterator gameInter;
while (userSelection != 4)
cout << "Type 1 to add a game to your list\n";
cout << "Type 2 to remove a game from your list\n";
cout << "Type 3 to list all games\n";
cout << "Type 4 to quit\n";
cin >> userSelection;
switch (userSelection)
case 1:
cout << "Type the game title to add: \n";
cin.get();
getline(cin, addGame);
list.push_back(addGame);
sort(list.begin(), list.end());
cin.clear();
cin.sync();
cout << "\nYour game was successfully added.\n";
break;
case 2:
cout << "Type the game title to remove: \n";
cin.get();
getline(cin, removeGame);
gameInter = find(list.begin(), list.end(), removeGame);
if (*gameInter == removeGame)
cout << "Title " << removeGame << " found\n";
list.erase(gameInter);
cout << "Title " << removeGame << " has been removed!\n";
else
cout << "Title " << removeGame << " cannot be found!\n";
break;
case 3:
cout << "\nYour Favorite Games Are: \n";
for (gameInter = list.begin(); gameInter != list.end(); gameInter++)
cout << listNum << ". " << *gameInter << endl;
break;
case 4:
cout << "Thank You for your input! Goodbye\n";
//userSelection = 4;
break;
default:
cout << "That is not a valid option\n";
break;
system("pause");
return false;
【问题讨论】:
1) 这就是为什么不应该在全局范围内使用using namespace std
:vector<string> list;
。 IE。不要将变量命名为与 STL 类型相同的名称。 2) 你遇到了什么错误?
反对者:请发表评论!
根据评论 #1,“尝试失败” - what 失败了?您不能只说“它不起作用”并期望一个没有问题描述的解决方案。这种方法的流行从未停止让我感到惊讶:人们期望它如何工作?无论如何,当 stdlib 为类似这样的情况提供出色的功能时,您可能应该省去手动重新发明***的麻烦,例如 std::set< std::pair<unsigned, std::string> >
,它将根据 pair::first
中的排名自动排序(如果有的话)关系存在,然后是pair::second
中的名称)。
@user3574939 将cout << listNum << ". " << *gameInter << endl;
更改为cout << listNum++ << ". " << *gameInter << endl;
并在for (gameInter = list.begin(); gameInter != list.end(); gameInter++)
之前添加listNum = 1;
@Torbjörn 为什么要增加 cmets?这个问题错过了第一名的minimal reproducible example。如果您想剖析显示的内容,请随时回答(题外话)。
【参考方案1】:
请考虑使用标准库提供的专用容器,让您的生活更轻松。它们的存在是为了避免您不得不煞费苦心地重新发明***,这样您就可以专注于您需要做的事情,而不是无聊的细节和围绕它的脚手架!不要误会我的意思:使用 vector
让您领先于许多人 - 通过不手动分配您自己的数组 - 但我们可以做得更好。
例如,要创建一组包含排名和标题的游戏,这些游戏将按排名自动排序(如果出现平局,则按标题排序):
#include <iostream>
#include <set>
#include <string>
#include <tuple> // pair
// Represent a game by its rank and title (typedef)
using game_type = std::pair<unsigned, std::string>;
// Create an ordered set of games
std::set<game_type> games;
// Populate it. You could do this from standard input.
games.emplace(3, "GTA V"); // constructs element in-place
games.emplace(1, "Legend Of Zelda");
games.emplace(2, "Contra");
// Verify that std::pair sorts by .first (and then .second)
for (auto const &it: games) // tidy C++11 iteration syntax
std::cout << it.first << ": " << it.second << std::endl;
输出是你想要的:
1: Legend of Zelda 2: Contra 3: GTA V
想要从用户输入中填充map
?当然。只需将排名和标题抓取到临时变量中,然后emplace(theRank, theTitle)
。
然后您可以开始考虑如何根据排名进行擦除,并很快在std::set
的文档或<algorithm>
中找到答案。我看到你已经看过后者了。那太棒了!它可以帮助我们,但有时会被忽视。或者人们使用它的功能但不#include
它并依赖于其他地方的间接包含......
无论如何。也许现在您希望/需要排名是唯一的,并且需要捕捉用户输入重复的情况?然后查看std::map
。
等等。标准库中有很多很棒的可能性。如果你错过了这些,同时也会因为不知不觉地试图自己重新发明它们而头疼,那将是一种耻辱。 ;-)
【讨论】:
以上是关于创建我的收藏夹列表的主要内容,如果未能解决你的问题,请参考以下文章