Ich möchte nach einem Wert in zwei std::vector
suchen. Wenn es in einem von ihnen gefunden wurde, möchte ich seinen Iterator zurückgeben. Wenn nicht, möchte ich einen Wert zurückgeben, der anzeigt, dass er nicht gefunden wurde.
In normalen Situationen, wo nur ein std::vector
beteiligt ist, würde ich std::vector::end
zurückgeben. Was soll ich in dieser Situation tun?
Normale Situation:
%Vor%Meine Situation:
%Vor% Ich möchte etwas zurückgeben, das ich später überprüfen kann, um zu wissen, dass die Zahl 10
in keinem von ihnen gefunden wurde.
Seit C ++ 14 können Sie value-initialisierte Iteratoren vergleichen, wenn sie der ForwardIterator-Kategorie oder stärker entsprechen (siehe [forward.iterators] Absatz 2). Ein Wert-initialisierter Iterator entspricht einem Null-Zeiger. Sie können also Folgendes verwenden:
%Vor%Und dann kann der Anrufer tun:
%Vor% Testen Sie einfach (rval != v2.end())
(rval ist der zurückgegebene Iterator). Ich weiß, das ist nicht sehr symmetrisch.
ODER
Übergeben Sie einen booleschen Wert als out
-Parameter
Sie könnten einfach den Ende-Iterator des äußersten rechten Vektors zurückgeben, dies ergibt einen logischen Sinn:
%Vor%Oder Sie könnten ein Iterator-Argument nehmen:
%Vor%Diese beiden hängen natürlich von Ihrem Anwendungsfall ab: Wenn Sie den zurückgegebenen Iterator für mehr als nur direkten Zugriff auf ein Element verwenden möchten, müssen Sie einen anderen Ansatz in Betracht ziehen:
--- BEARBEITEN ---
Wenn Sie den Iterator über den direkten Zugriff auf das betreffende Element hinaus verwenden möchten, können Sie std::reference_wrapper
verwenden, um einen Verweis auf den betreffenden Vektor zurückgeben zu lassen (oder Sie könnten einfach einen Zeiger zurückgeben).
Live-Demo: Ссылка
Nicht wirklich genial, nehme ich an, aber ... Ich schlage vor, ein std::pair
zurückzugeben, wobei das erste Element ein int ist (0 für "nicht gefunden", 1 für "gefunden im ersten" und 2 für "gefunden im zweiten) ") und der zweite ist der Iterator.
Etwas wie
%Vor% Oder besser: Sie könnten ein Iteratorpaar zurückgeben, wobei der zweite der cend()
des entsprechenden Vektors ist; etwas wie
Ich denke, es ist wichtig, den cend()
correspindig-Iterator zurückzugeben, weil ich vermute, dass Sie den Iterator verwenden möchten, der auf 10 zeigt, und Sie könnten ihn iterieren.
Natürlich, wenn Sie nur wissen möchten, ob 10 in v1
oder in v2
vorhanden ist, sollten Sie einen bool
: true
für "gefunden" zurückgeben ", false
sonst; etwas wie
ps .: Entschuldigung für mein schlechtes Englisch.