用户在地图

时间:2015-06-12 20:30:20

标签: c++ maps

我目前正在编写命令行游戏程序,我已将类别和解决方案存储在map<string, vector<string>>中。键值是类别,向量是解决方案字符串的向量。

我想提示用户选择一个类别,但是我不确定最好的方法,因为我不想强迫用户手动输入类别,因此只接收带有选择的int

有没有办法使用int来访问地图? (例如solutionMap [2] =第二个值?)

以下是我的代码中的一个片段,只是为了澄清

cout << "\nCategories:\n-----------" << endl;
int categoryCount = 1;
for (map<string, vector<string> >::iterator it = solutionMap.begin(); it != solutionMap.end(); ++it){
    cout << categoryCount << ": " << it->first << endl;
    ++categoryCount;
}

// Prompt user for selection and save as currentCategory
int currentCategory;
bool isValid = false;

do{
    cout << "Please enter the number of the category you would like to use: ";
    cin >> currentCategory;

    // if cin worked and number is in range, continue out of the loop
    if (cin.good() && currentCategory <= solutionMap.size()){
        isValid = true;
    }
    else{
        cout << "Invalid entry!" << endl;

        // Clear the buffer
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
} while (!isValid);

此时我想做的是将数字发送到游戏类,并使用所选键值从矢量中选择一个随机解决方案,但据我所知,我需要选择作为字符串来找到它。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

如果要使用整数索引访问地图,可以按以下步骤操作:

 auto ix=solutionMap.begin();   // bidirectional iterator to the map 
 advance (ix,currentCategory);  // move the iterator
 cout << "choice is "<<ix->second<<endl;      // here you are 

但要小心:只要插入/删除元素,元素的数量可能就不再与您显示的菜单相对应。

它是如何运作的?

映射的迭代器是双向的:您一次只能前进或后退1个元素。 advance() 重复此操作正确的次数

替代方案

如果您没有真正将地图用作关联数组,并且主要使用菜单和索引,则应使用向量而不是地图来选择其他变体:

 vector<pair<string, vector<string>> solutionMap; 

然后,您可以使用索引轻松访问元素。如果您需要通过使用键字符串偶尔找到特定元素,您仍然可以使用find_if()。