C ++:将矢量中的项目存储到地图中

时间:2013-11-01 16:50:00

标签: c++ for-loop vector map iterator

主程序必须将购物清单存储在名为:lists的键值对的映射中。密钥必须是包含杂货店名称的字符串,并且值必须是包含该商店的商品清单的字符串向量。

我正在使用的功能

void CreateList() 
{  
std::string store;
std::string item;
std::cout << "What is the grocery store name" << std::endl;
std::cin >> store;

std::vector<std::string> store_list;
do {
    std::cout << "Enter a list of items for this grocery store one at a time. When you are done, type done." << std::endl;
    std::cin >> item;
    if (item == "done") break;
    store_list.emplace_back(item);
    std::cout << "Added " << item << "to " << store << "list" << std::endl;
} while (true);

main()的 {

while (true)
{
    int choice;
    DisplayMenu();
    cout<<"What menu choice would you like?"<<endl;
    cin>>choice;
    if (choice == 1)
        CreateList();
    if (choice == 2)
        ExportLists();
    if (choice == 3)
        cout<<"Thank you for using!"<<endl;
        break;
    else
    cout<<"Please enter a valid choice."<<endl;
}
map<string, vector<string> > list;
map<string, vector<string> >::iterator ListItr;
vector<string>::iterator VecItr;
for (ListItr = list.begin(); ListItr != list.end(); ++ListItr)
{
    for (VecItr = ListItr ->second.begin();
        VecItr != ListItr ->second.end();
        ++VecItr)
    {
        list[store].push_back(*VecItr);
    }

}

我的问题是我无法弄清楚如何正确迭代在CreateList()中创建的向量,并将该向量中的项添加到地图中,我也很难弄清楚如何获得杂货商店名称。我是否必须让CreateList()函数返回一些内容才能执行此操作?这是我第一次尝试从python转换到C ++程序,所以请简化所有答案。谢谢你的时间。

2 个答案:

答案 0 :(得分:1)

您可以在第一个while循环中填充商店地图。 以下程序演示了如何填充地图以及如何迭代地图中的项目。

#include <iostream>
#include <vector>
#include <string>
#include <map>


typedef std::vector<std::string> items_t;
typedef std::pair<std::string, items_t> store_t;
typedef std::map<std::string, items_t> stores_t;

store_t CreateList() 
{
    std::string store;
    std::string item;
    std::cout << "What is the grocery store name" << std::endl;
    std::cin >> store;

    std::vector<std::string> store_list;
    while((
            std::cout << "Enter a list of items for this grocery store one at a time."
                << "When you are done, type done." << std::endl,
                std::cin >> item,
                item != "done"))
    {
        store_list.emplace_back(item);
        std::cout << "Added " << item << " to " << store << " list" << std::endl;
    }
    return store_t(store,store_list);
}

void DisplayMenu() {
    std::cout << "DisplayMenu()\n";
}

int main() {
    stores_t stores;
    int choice;

    do {
        DisplayMenu();
        std::cout<<"What menu choice would you like?\n";
        std::cin>>choice;
        switch (choice) {
        case 1:
        {
            stores.emplace(CreateList());
        }
        break;
        case 2:
            // not implemented
        case 3:
            std::cout<<"Thank you for using!\n";
            break;
        default:
            std::cout<<"Please enter a valid choice.\n";
        }
    } while (choice != 3);

    // Look what stores we have:
    for(auto iter=stores.begin(); iter != stores.end(); iter++) {
        std::cout << "\n\nStore " << iter->first << " has the following items:\n";
        items_t& items(iter->second);

        for(auto iterItem=items.begin(); iterItem != items.end(); iterItem++) {
            std::cout << *iterItem << ", ";
        }
    }

    return 0;
}

然而,代码需要进一步清理才能用于实际程序。 是否可以将CreateList()作为返回值检索商店。

注意,您应该始终在stackoverflow上发布编译最小示例。如果编译器给出错误,则发布最小的示例以及相应的错误消息。

答案 1 :(得分:0)

尝试简化答案: CreateList()应返回一对:

pair<string, vector<string>> 

是store_name(string),item_list(vector)。

因此在main函数中,您可以将其插入到map&gt;列表:

 list.insert(pair<string, vector<string>>);

您的其他代码对我来说很合适。