Überprüfung, ob der Iterator keinem Element zugewiesen ist, wenn kein bestimmter Container vorhanden ist

8

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.

    
Humam Helfawi 06.08.2016, 18:58
quelle

4 Antworten

8

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%     
Jonathan Wakely 06.08.2016, 19:13
quelle
1
%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

%Vor%     
Jean-François Fabre 06.08.2016 19:05
quelle
1

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).

%Vor%

Live-Demo: Ссылка

    
kfsone 06.08.2016 19:07
quelle
1

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

%Vor%

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

%Vor%

ps .: Entschuldigung für mein schlechtes Englisch.

    
max66 06.08.2016 19:08
quelle

Tags und Links