将结构添加到映射 C++
adding structs to a map c++
我在将两个结构添加到值是向量的映射时遇到了一些问题。
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-statment' 中的注释行似乎有效,但我不确定这是否是将新条目插入地图的正确方法。下面是这两个结构的代码,如果有帮助的话。
struct Orders
{
std::string sId;
std::string sFulfillmentOrderId;
};
struct Items
{
std::string sId;
std::string sLineItemId;
std::string sFulfillmentStatus;
std::string sFulfillmentException;
};
您正在尝试将 Orders
-Items
对插入到 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);
虽然如果您确实 包含错误消息 会有所帮助,但在这种情况下很容易看出您试图在地图中插入错误的类型。
records
容器将键类型 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 );
问题是您将不同类型的对传递给地图。地图接受对类型<Order, vector<Item>>
。但是,您发送的类型是 <Order, Item>
.
您必须更改所需地图的类型或要插入的地图类型。
我在将两个结构添加到值是向量的映射时遇到了一些问题。
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-statment' 中的注释行似乎有效,但我不确定这是否是将新条目插入地图的正确方法。下面是这两个结构的代码,如果有帮助的话。
struct Orders
{
std::string sId;
std::string sFulfillmentOrderId;
};
struct Items
{
std::string sId;
std::string sLineItemId;
std::string sFulfillmentStatus;
std::string sFulfillmentException;
};
您正在尝试将 Orders
-Items
对插入到 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);
虽然如果您确实 包含错误消息 会有所帮助,但在这种情况下很容易看出您试图在地图中插入错误的类型。
records
容器将键类型 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 );
问题是您将不同类型的对传递给地图。地图接受对类型<Order, vector<Item>>
。但是,您发送的类型是 <Order, Item>
.
您必须更改所需地图的类型或要插入的地图类型。