2016-04-06 43 views
0

値がベクトルの2つの構造体をマップに追加するときに問題が発生します。マップに構造体を追加する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); 
      } 
     } 

私は「ペア」または「make_pair」機能のいずれかで「records.insertを()」を使用しようとすると、それは私が本当に理解していないことを私は、このエラーが発生します。 'if-statment'のコメント行は機能しているようですが、新しいエントリをマップに挿入する正しい方法かどうかはわかりません。以下は、2つの構造体のコードです。

struct Orders 
{ 
    std::string sId; 
    std::string sFulfillmentOrderId; 
}; 

struct Items 
{ 
    std::string sId; 
    std::string sLineItemId; 
    std::string sFulfillmentStatus; 
    std::string sFulfillmentException; 
}; 
+0

エラーは何ですか? –

+0

ポップクイズ、読みやすくなったもの "for(std :: vector :: iterator vIter = mvCardConfirmationReceiptList.begin(); vIter!= mvCardConfirmationReceiptList.end(); ++ vIter)"または "for(auto&order :mvCardConfirmationReceiptList) "? –

答えて

1

あなたが実際にエラーメッセージが含まれている場合、それは助けただろうが、それはこの中で見るのは簡単ですあなたのマップに間違ったタイプを挿入しようとしている場合です。

コンテナは、キータイプOrdersを値タイプstd::vector<Items>にマッピングします。しかし、あなたの挿入ラインは、std::vector<Items>の代わりにItemsを1つ追加しようとしています。

あなたは、そのアイテムを含むベクトルを作成する必要があります。それを行うにはいくつかの方法があります。最も簡単なものは次のとおりです。

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

より現代的なアプローチは、emplaceの代わりinsertを使用することです。

もちろん、あなたの場合、この検索は冗長です。マップoperator[]を使用すると、存在しない場合は新しいエントリが作成されます。したがって、if-elseブロック全体が凝縮することができます。

records[order].push_back(item); 
+0

エラーを修正しました。その値を '1'で取り出すときに何か別のことをしなくてはなりませんか?それは単なる指標ですか? –

+0

あなたが追加した 'records [order]'追加のために、なぜ私のコードのコメント部分がうまくいったのですか?それはいい練習ですか? –

+0

いいえ、それは 'std :: vector'のコンストラクタでした。 1つの要素を持つベクトルを作成し、その値を 'item'とします。私はちょうどあなたがこれを行う必要はないことを示唆する私の投稿を編集しました。 – paddy

0

あなたはOrders挿入しようとしている - std::vector<Items> - Ordersstd::mapItemsペアを。代わりにこれを試してみてください:

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

またはストアitemしてから行う、

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

問題は、異なる種類のペアをマップに渡すことです。このマップはペアタイプ<Order, vector<Item>>を受け入れます。ただし、タイプ<Order, Item>を送信しています。

マップの種類を変更するか、挿入するマップの種類を変更する必要があります。

関連する問題