Ich war ein fast ausschließlich C# -Programmierer für die letzten 6 Jahre. Ich arbeite jetzt an einem Projekt, in dem C++ die Sprache der Wahl ist, und STL ist unsere Bibliothek für Sammlungen.Tipps für die Annahme eines STL-Geistes
Nachdem ich C# 's LINQ verwendet habe, fällt es mir sehr schwer, in eine STL-Umgebung einzusteigen.
Als Beispiel: Schreiben Sie ein Äquivalent von IEnumerator.Select.
C#
public static IEnumerator<Output> Select(this IEnumerator<Input> input, Func<Input, Output> func) {
while (input.MoveNext) {
yield return func(input.Current);
}
}
Super einfach.
Jetzt versuchen, etwas ähnliches in C++ und STL zu schreiben. (Die Frage der bequemen Syntax des yield-Schlüsselworts und der anonymen Funktionen beiseite lassen).
Es kann nicht einmal getan werden, ohne zuerst eine Reihe von schwierigen Fragen zu beantworten. Da STL-Enumeratoren Inter-Enumerator-Vergleiche anstelle von MoveNext verwenden, müssen Sie entscheiden, wie hoch der Endwert Ihres Enumerators sein soll. Dann musst du dich mit all dem iterator_traits Unsinn herumschlagen. STL verwendet den Vorlagenversand der Kompilierungszeit anstelle des dynamischen Dispatchs der Laufzeit. Daher muss Ihr Iterator nicht nur auf den Werttyp des Eingabeenumerators, sondern auch auf die spezielle Art des Eingabeenumerators festgelegt sein.
Erhalte mich nicht einmal zu der Zeit, als ich versuchte, einen Map-Join-Iterator in STL zu schreiben.
Aus dem Blick auf den Code, den andere Leute schreiben, bin ich zu dem Schluss gekommen, dass STL, unverstärkt mit Boost, selten für etwas anderes als Sammlungen und Sortieren verwendet wird.
Meine proximalen Beobachtungen sind:
- Gibt es eine Möglichkeit, um kurz und bündig eine Mutation Iterator in STL zu schreiben?
- Wie summieren Sie eine Sammlung summarisch in eine andere?
Allgemeiner gesagt, ich habe ein paar Dinge aufgefallen, die mit meiner gewohnten Denkweise kollidieren:
- AWL-Code nicht prägnant zu sein scheint. Ist es mein Ziel, prägnanten Code beim Schreiben von STL-Code zu schreiben? (Durch nicht kurz, ich meine, oft beinhaltet sehr lange Typ-IDs)
- Boost scheint eine fast Voraussetzung für das Schreiben von Algorithmen in STL sein. Was machen Leute, die Boost nicht benutzen dürfen?
Nein, die Ströme sind gebrochen, aber der Rest ist in Ordnung. Boost und QT erweitern beide die STL in viel größere Frameworks, Boost als allgemeine Erweiterung, QT für GUI-bezogene Sachen. Wenn ich 'IEnumerator.Select' richtig verstehe, nennen wir das' boost :: transform_iterator'. Wenn ich "boost :: zip_iterator" verstehe, ist das der Map-Join-Iterator. –
Ich sollte beachten, dass meine Projektanforderungen Boost verbieten. –
Sie sollten einen Blick darauf werfen, was der '' Header bietet –
Attila