2017-04-27 5 views
0

私は関数本体をラムダに変換したいです。しかし、この文をラムダに実装する方法がわかりません。私はまたこれのために使用するのが最善であるか分からない。 std :: find_if、std :: findなどを使用する方が良いですか?functionbodyをlambdaに変換するにはどうすればよいですか?

void Inventory::RemoveFromInventory(std::string item) 
{ 
    //--bool to check if an item is in the inventory 
    bool found = false; 

    for (std::list<Item>::iterator i = m_Inventory.begin(); i != m_Inventory.end(); i++) 
    { 
     if (i->GetName() == item) 
     { 
      m_Inventory.erase(i); 
      found = true; 
      break; 
     } 
    } 
    if (found == false) 
    { 
     std::cout << "item not in inventory!" << std::endl; 
    } 
} 

Cann誰かがこの変換の問題を助けますか?

+1

好奇心が沸くので、どうしたらいいですか? afaik lambdasは主にファンクタのための構文的な砂糖ですが、すでにこのメソッドを書き留めておけば、何を得ますか? – user463035818

+0

は、学校の割り当てのためにこれをhttp://stackoverflow.com/questions/347441/erasing-elements-from-a-vector – Caleth

+0

で見ています。できるだけラムダを実装する必要があります。これはthsi関数のために可能ですか? –

答えて

3

したがって、条件を確認するアイテムを検索し、見つかったかどうかを確認して消去します。これはstd::find_ifの使用例です。

void Inventory::RemoveFromInventory(std::string item) 
{ 
    auto const foundAt = std::find_if(
     begin(m_Inventory), 
     end(m_Inventory), 
     [&](Item const &i) { return i.GetName() == item; } 
    ); 

    if(foundAt == end(m_Inventory)) { 
     std::cout << "item not in inventory!\n"; 
    } else { 
     m_Inventory.erase(foundAt); 
    } 
} 
+1

@Gruffalo 'begin'と' end'はADLによって見つかります。 'find_if'もありますが、私は個人的にそれを予選することを好みます。 – Quentin

+0

'std :: begin'と' std :: end'を使ってADLが正しく動作するようにしてはいけませんか? –

+0

@EmeraldWeapon 'std :: beginを使用しています。 begin(a); 'は、' a'がCスタイルの配列である場合をサポートする必要がある場合にのみ必要です。 – Quentin

関連する問題