Angenommen, ich habe einen Vektor von ganzen Zahlen und von Strings, und ich möchte vergleichen, ob sie äquivalente Elemente haben, ohne Berücksichtigung der Reihenfolge. Letztendlich frage ich, ob der Integer-Vektor eine Permutation des String-Vektors ist (oder umgekehrt). Ich möchte in der Lage sein, einfach is_permutation aufzurufen, ein binäres Prädikat anzugeben, das es mir erlaubt, die beiden zu vergleichen, und mit meinem Leben weiterzumachen. zB:Warum kann nicht std :: is_permutation zwischen zwei verschiedenen Arten von Daten handeln?
bool checkIntStringComparison(const std::vector<int>& intVec,
const std::vector<std::string>& stringVec,
const std::map<int, std::string>& intStringMap){
return std::is_permutation<std::vector<int>::const_iterator, std::vector<std::string>::const_iterator>(
intVec.cbegin(), intVec.cend(), stringVec.cbegin(), [&intStringMap](const int& i, const std::string& string){
return string == intStringMap.at(i);
});
}
Aber versuchen, dies zu kompilieren (in gcc) gibt eine Fehlermeldung, läuft darauf hinaus: für Call
keine Übereinstimmung zu Sachen :: < Lambda (const int &, const string &>) (const std :: _ cxx11 :: basic_string &, const int &)
siehe h Wodurch schaltet er die rufende Signatur von den Lambda's? Wenn ich sie umschalte, schaltet sich die Signatur in die andere Richtung um.
Um diesen Fehler zu umgehen scheint es, dass der Standard für std :: is_permutation angibt, dass ForwardIterator1 und 2 vom gleichen Typ sein müssen. Also verstehe ich den Compiler Fehler in dieser Hinsicht. Aber warum sollte es so sein? Wenn ich ein binäres Prädikat zur Verfügung stelle, das es mir erlaubt, die beiden zu vergleichen (oder wenn wir zuvor einen Gleichheitsoperator zwischen den beiden definiert haben?), Ist der eigentliche Kern des Algorithmus nicht nur die Suche in Container 1, um sicherzustellen, dass alle seine Elemente sind in Behälter 2 einzigartig?
Wie genau wird es Ihnen helfen, wenn Sie wüssten, warum dies der Fall war? Warum nicht fragen? "Ich habe entdeckt, dass is_permutation nur für identische Iterator-Typen für die beiden Sequenzen funktioniert. Ich möchte dies auf nicht-identischen Iterator-Typen tun. Wie kann ich das tun?" Wie geschrieben, können die Antworter in alte Standardisierungsdiskussionen und/oder Standardgeschichte eintauchen und einige Informationen darüber finden, warum dies gemacht wurde, aber ich vermute, dass die Antwort "weil KISS" ist. – Yakk
Weil ich etwas Nützliches über die Arten der Annahmen lernen könnte, die die Standardschablonenbibliothek macht, wenn ich es verwende? Weil es für mich zumindest hilfreicher ist, die Theorie zu verstehen, warum ein Ding ein Weg ist, als jemanden einfach darum zu bitten, mein Problem für mich zu lösen? – shavera