创建我的收藏夹列表

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 stdvector&lt;string&gt; list;。 IE。不要将变量命名为与 STL 类型相同的名称。 2) 你遇到了什么错误? 反对者:请发表评论! 根据评论 #1,“尝试失败” - what 失败了?您不能只说“它不起作用”并期望一个没有问题描述的解决方案。这种方法的流行从未停止让我感到惊讶:人们期望它如何工作?无论如何,当 stdlib 为类似这样的情况提供出色的功能时,您可能应该省去手动重新发明***的麻烦,例如 std::set&lt; std::pair&lt;unsigned, std::string&gt; &gt;,它将根据 pair::first 中的排名自动排序(如果有的话)关系存在,然后是pair::second 中的名称)。 @user3574939 将cout &lt;&lt; listNum &lt;&lt; ". " &lt;&lt; *gameInter &lt;&lt; endl; 更改为cout &lt;&lt; listNum++ &lt;&lt; ". " &lt;&lt; *gameInter &lt;&lt; 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 的文档或&lt;algorithm&gt; 中找到答案。我看到你已经看过后者了。那太棒了!它可以帮助我们,但有时会被忽视。或者人们使用它的功能但不#include它并依赖于其他地方的间接包含......

无论如何。也许现在您希望/需要排名是唯一的,并且需要捕捉用户输入重复的情况?然后查看std::map

等等。标准库中有很多很棒的可能性。如果你错过了这些,同时也会因为不知不觉地试图自己重新发明它们而头疼,那将是一种耻辱。 ;-)

【讨论】:

以上是关于创建我的收藏夹列表的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何从 JSON 创建收藏夹列表

我的收藏列表

如何计算我的游戏收藏数据库中的实体关系?

单击收藏夹按钮时更新列表视图

在模型创建时创建 OneToOne 实例

在列表视图中添加收藏按钮