向映射c++添加structs

adding structs to a map c++

本文关键字:structs 添加 c++ 映射      更新时间:2023-10-16

在将两个结构添加到值为向量的映射中时遇到一些问题。

std::map<Orders, std::vector<Items>> records;
        for(std::vector<StdCardConfirmationReceipt>::iterator vIter= mvCardConfirmationReceiptList.begin(); vIter != mvCardConfirmationReceiptList.end(); ++vIter)
        {
            Orders order = {(*vIter).getOrderIdOrderCentral,(*vIter).getFulfillmentOrderIdOrderCentral};
            Items item = {(*vIter).getItemIdOrderCentral,(*vIter).getLineItemIdOrderCentral, (*vIter).getItemFulfillmentStatusOrderCentral, (*vIter).getFulfillmentExceptionOrderCentral};
            if (records.find(order) == records.end())
            {
                records.insert(std::make_pair(order,item));
                //records[order];
                //records[order].push_back(item);
            }
            else
            {
                records[order].push_back(item);
            }
       }

当我尝试将"records.insert()"与"pair"或"make_pair"函数一起使用时,它会给我带来一个我并不真正理解的错误。"if语句"中的注释行似乎有效,但我不确定这是否是在映射中插入新条目的正确方式。如果有帮助的话,下面是这两个结构的代码。

struct Orders
{
    std::string sId;
    std::string sFulfillmentOrderId;
};
struct Items
{
    std::string sId;
    std::string sLineItemId;
    std::string sFulfillmentStatus;
    std::string sFulfillmentException;
};

虽然如果您真的包含错误消息会有所帮助,但在这种情况下,很容易看出您试图在映射中插入错误的类型。

CCD_ 1容器将Orders的键类型映射到std::vector<Items>的值类型。但是您的插入行试图添加一个Items而不是std::vector<Items>

你应该创建一个包含该项的向量。有几种方法可以做到这一点。最简单的是:

records.insert( std::make_pair( order, std::vector<Items>( 1, item ) ) );

更现代的方法是使用emplace而不是insert

当然,在您的情况下,这种搜索无论如何都是多余的。使用映射operator[]将创建一个新条目(如果不存在)。所以你的整个if-else区块可以浓缩为:

records[order].push_back( item );

您正试图将Orders-records0对插入到Orders-std::vector<Items>std::map中。试试这个:

records.insert(std::make_pair(order, std::vector<Items>(item));

或者将item存储在临时std::vector<Items> temp中,然后执行

records.insert(std::make_pair(order, temp);

问题是您正在向映射传递不同类型的对。映射接受类型为<Order, vector<Item>>的对。但是,您发送的是类型<Order, Item>

你必须改变你想要的地图类型,或者你要插入的东西的类型。