2017-01-04 2 views
0

Mit C++ 11, möchte ich über einen Vektor iterieren und geben Sie einen Typ zurück, der angibt, dass der Index nicht gefunden wurde.Iterieren über Vektor des benutzerdefinierten Objekts mit zwei Bedingungen

Ich bin zu der traditionellen for(;;) Schleife und Angabe der Index manuell, wie mein Code unten zeigt.

inline std::size_t ItemList::FindItem(Items& Item) 
{ 
    for (std::size_t i = 0; i < ItemVector.size(); i++) 
    { 
     if (ItemVector[i]->GetId() == Item.GetId() && !ItemVector[i]->GetName().compare(Item.GetName())) 
     { 
      return i + 1; 
     } 

    } 
    return 0; 
} 

ich auch den Index +1, um von 0 einen Wert zurückgeben zu erhöhen, mit (unsigned size_t aufzunehmen), um die Rufmethode, um anzuzeigen, dass der Index nicht gefunden wurde (Ich verstehe das asinine ist) . Ich nehme an, es wäre besser, etwas mehr wie std::end() zurückgeben?

Wäre die Verwendung eines C++ 11-Iterator-Ansatzes effizienter? Der Vektor wird zu einer großen Anzahl auffüllen und der Fund muss schnell sein.

Antwort

5

Sie könnten std::find_if verwenden und mit Iteratoren arbeiten:

auto it = std::find_if(ItemVector.begin(), ItemVector.end(), 
    [&Item](Items *value) { 
     return value->GetId() == Item.GetId() && !value->GetName().compare(Item.GetName()); 
    } 
); 

Dann können Sie einfach testen, ob it != ItemVector.end() wissen, ob Sie etwas gefunden.

Es wird wahrscheinlich keinen (oder sehr kleinen) Unterschied zwischen dieser und Ihrer Version hinsichtlich der Geschwindigkeit geben, aber es ist ein saubererer Weg, um zu überprüfen, ob etwas gefunden wurde oder nicht.

+0

Da die ursprüngliche Frage geht 'Item' Bezug genommen wird, gehe ich davon aus, es ist ein großer Schrift . Vielleicht möchten Sie als Referenz mit '[& Item]' aufnehmen. –

+0

@ FrançoisAndrieux Ja, danke, Antwort aktualisiert. – Holt

+0

Dies wird 'end()' zurückgeben, wenn die Bedingung nicht erfüllt ist, oder? – user0000001

1

Ja, ein Iterator wäre der Weg, dies zu tun, sind Sie eigentlich Ihre eigene Version von find_if schreiben könnten Sie stattdessen tun:

find_if(cbegin(ItemVector), cend(ItemVector), [&](const auto& i){ return i.GetId() == Item.GetId() && i.GetName() != Item.GetName(); }) 

Sie können testen, ob das Ergebnis dieser Funktion gefunden wurde Prüfung auf Gleichheit mit cend(ItemVector).

Zusätzlich, wenn Sie den Index des Elements finden müssen Sie das Ergebnis nach cbegin(ItemVector) passieren kann: distance

Live Example

Verwandte Themen