2016-07-10 18 views
0

Ich versuche derzeit zu finden find_if ein Element in einem Vektor von Paaren zu finden.Ich habe versucht, auf Google zu suchen, wie < < Operator überladen und es gab mir eine große Menge an Informationen wie man überlädt < <. Es hat mich immer noch verwirrt, wie ich mein Ziel erreichen kann. Unten ist der Code, den ich verwende, ich möchte die Zeichenfolge finden, die der Funktion in meinem Vektor von Paaren s zur Verfügung gestellt wird.Überladung << für Vektor von Paaren Iterator

void Utils::findIt(string serchVal) 
{ 
    vector<pair<string, HWND>>::iterator it = find_if(s.begin(), s.end(), 
[&serchVal](const pair<string, HWND>& element) { return element.first == serchVal; }); 

    cout << "find function found : " << *it << endl; 

} 

Ich habe versucht, die < < Betreiber wie diese zu überlasten.

template <typename T, typename D> 
void operator<<(ostream& os, vector<pair(typename T, typename D)> &lst) 
{ 
    cout << lst.begin.front(); 
} 

Ich bin nicht gut in Überladung Funktionen und ich bin noch neu in Vektoren. also jede Hilfe in diesem Zusammenhang wäre willkommen!

+0

finde ich [diese] (http://www.tutorialspoint.com/cplusplus/cpp_overloading.htm) sehr nützlich. Sie sollten einen Verweis auf den Stream zurückgeben. Und innerhalb der Überladung sollten Sie etwas in den Strom legen. 'lst.begin.front();' ist ein Noop, was hast du erwartet? Im Allgemeinen sollten Sie Fehlermeldungen (falls vorhanden), gewünschtes und tatsächliches Verhalten, wenn Sie Hilfe bei der Korrektur von Code benötigen, posten. – user463035818

+1

Was - abgesehen davon, dass potentiell zur Ausgabe des Ergebnisses verwendet wird - hat das Überladen von 'operator <<()' damit zu tun, einen String zu finden? Der Grund, warum ich frage, ist, dass deine Frage verwirrt ist - und die nicht verwandten Konzepte, eine Zeichenfolge zu finden und etwas auszugeben, werden irgendwie kombiniert. – Peter

Antwort

0

Sie brauchen nicht operator<<, um eine Überlastung für eine std::vector<std::pair> hier als std::find_if kehrt das Iterator auf das Element zeigt in die std::vector gefunden, die in diesem Fall einen Iterator zu einem std::pair<std::string, HWND>, sei es über eine std::ostream drucken könnten Sie verwenden,

template<typename _Ty1, typename _Ty2> 
std::ostream& operator<<(std::ostream& _os, const std::pair<_Ty1, _Ty2>& _p) { 
    _os << _p.first << ' ' << _p.second; 
    return _os; 
} 

, wenn Sie die operator<< Überlastung Weg gehen wollen. Das Drucken von Elementen einer std::pair ist jedoch trotzdem trivial, so dass eine Überladung des Einfügeoperators hier nicht völlig notwendig ist.

+0

mit diesem bekomme ich nur den Fehler "binary '<<': kein Operator gefunden, der einen rechten Operanden vom Typ 'std :: pair ' (oder es gibt keine akzeptable Konvertierung)" Ich bin auch für Vorschläge auf andere Weise, um dies zu lösen – jake

+0

@mike Ich habe nicht viel Windows-API-Programmierung getan, aber ich kann nur davon ausgehen, dass 'HWND' hat keine überladenen' Operator << ', müssten Sie Ihre eigenen zur Verfügung stellen (wenn es in diesem Fall sogar Sinn macht). Wenn Sie nur die 'std :: string 'des' std :: pairs' ausdrucken wollen, dann benutzen Sie 'std :: cout << (* it) .first 'anstelle der Aussage in Ihrer Frage. – ArchbishopOfBanterbury

0

Der vollständige Code für Ihr Problem:

#include <iostream> 
#include <vector> 
#include <utility> 

template <typename T, typename D> 
std::ostream& operator<<(std::ostream& os, std::vector<std::pair<T, D>> &lst) { 
    for (const auto &p : lst) { 
     os << p.first << ", " << p.second; 
    } 
    return os; 
} 

int main() { 
    std::vector<std::pair<int, int>> pairs = { { 1, 2 }, { 5, 6 } }; 
    std::cout << pairs << std::endl; 
    return 0; 
} 

Schritt für Schritt:

  1. Normalerweise ist es besser std::ostream& zurück zum Anrufer-Code zurück, wir Ihren void operator<<-std::ostream& operator<< Prototyp so ändern.
  2. In der operator<< tun Sie einfach was Sie wollen. Wenn Sie pair ‚s Daten in der Ausgabe - es gibt setzen:

    for (const auto &p : lst) { 
        os << p.first << ", " << p.second; 
    } 
    
Verwandte Themen