Warum nicht überlasten operator+=() für std::vector?

Habe ich angefangen zu lernen, C++, so dass ich nicht weiß in meinem Mangel an wissen/Erfahrung, warum etwas so scheinbar einfach um einen rookie als was ich bin, zu beschreiben, ist nicht bereits in der STL. Hinzufügen eines Vektors zu einem anderen Vektor zu können, geben Sie diese:

v1.insert(v1.end(), v2.begin(), v2.end());

Frage ich mich, ob in der realen Welt Menschen, die einfach nur die überlastung der + = - operator, um diese weniger ausführlich, zum Beispiel, um die Wirkung von

template <typename T>
void operator+=(std::vector<T> &v1, const std::vector<T> &v2) {
    v1.insert(v1.end(), v2.begin(), v2.end());
}

so, dann können Sie

v1 += v2;

Ich habe auch dieses set up für push_back zu "+=" ein element an das Ende. Gibt es irgendein Grund, diese Dinge nicht getan werden sollte oder sind speziell von Personen vermieden, die kompetent in C++?

  • Ich würde vermuten, es ist nicht der standard, weil es ist ein bisschen umständlich - so, wie Sie es getan habe, den Wert-Typen der Vektoren muss auch identisch sein, wobei eigentlich könnte man Anhängen, beliebigen container (oder-Bereich) jeder Art, Cabrio zu den Wert-Typ der auf der LHS. Und das ist, was insert bereits. Auch gibt es zwei plausible Bedeutungen für die addition von Vektoren - Verkettung, wie Sie hier getan haben, oder paarweise neben wie valarray hat, erfordern Operanden von gleicher Größe. So ist es nicht ein Idealer Kandidat für den operator zu überladen.
  • Nicht zu erwähnen, dass aus dem Titel bin ich davon ausgegangen, du meintest zu führen v[i] += v[i] über alle Elemente.
  • Operator-überladung sinnvoll ist, im gleichen bestimmten Fällen, aber Häufig führt es zu Verhalten, dass Menschen überraschend finden. Verhaltensweisen, die offensichtlich scheinen zu einer scheinbar nicht so zum anderen. Persönlich, ich dachte, ich Anhängen, wenn ich sah, den Titel in Frage, und das ist, weil ich in der Regel mit Python, nicht C++.
  • IMHO ein Grund nicht denken operator+=() als pairwise addition ist, weil der Zweck ein Vektor ist, um Elemente enthalten. Bedienung der Elemente ist, was ich denken würde, über das design/die Verantwortung des Vektors. Basierend auf dieser dann nach dem Prinzip der geringsten Rechte operator+=() sollte davon ausgegangen werden, Vektor einfügen.
  • Offensichtlich hast du noch nie benutzt MatLab (oder octave).
  • Ich denke, dass ist schon ein unfairer Vergleich; trotz der Bezeichnungen der Datentypen vector ist eine grundlegend andere Datentyp in C++ als Octave oder Matlab -- die ehemaligen implementiert die informatik definition von 'Vektor' (ein eindimensionales array), während die letztere implementieren die algebraische definition von "vector" (a one-dimensional matrix). Denn Sie sind grundlegend anders, Sie erwarten sollte, sich anders zu Verhalten und anders genutzt werden.
  • Wo glaubst du, informatik bekam das Wort Vektor aus in den ersten Platz? Es gibt keinen grundlegenden Unterschied. In der Tat, in MatLab ein string ist ein Vektor der element-Typ char. In vielerlei Hinsicht ist informatik algebra.
  • Der grundlegende Unterschied ist, wie man verwendet in der Regel einen Vektor in diesen beiden Domänen. Der Ursprung des Wortes ist irrelevant.
  • Sie glaube nicht, dass jemand verwendet C++ für die Berechnung, Speicherung von numerischen Daten in z.B. eine vector<complex<double>>?
  • Sicher, aber Sie sind die Minderheit im Vergleich zum rest von C++ - Benutzer.
  • Und jeder einzelne MatLab-Programmierer fällt in diese Minderheit (wenn Sie die C++ überhaupt). Was direkt impliziert mein Erster Kommentar.
  • Und jeder einzelne Matlab-Programmierer, kümmert sich um performance, weiß nicht verwenden std::vector. Das ist wirklich eine sinnlose Diskussion.
  • Ich benutze Matlab für mehr als 60% meiner Arbeit. Ich nehme an, einer der Gründe, warum ich nicht stolpern, + = als pairwise element ist darüber hinaus, denn ich bin nicht mit Vektor für numerische Daten, sondern speichern Sie eine Liste von Objekten, die nicht Hinzugefügt werden können, zusammen. Wenn ich ging, um einen container darstellt numerische Elemente würde ich wahrscheinlich eine Art von matrix-Bibliothek. Allerdings verstehe ich jetzt, dass wenn Sie etwas, das wie vector<double> v1, v2; und später v1 += v2; es könnte zweideutig.
  • Dann würden Sie sicherlich erwarten, dass v1 + v2 durchführen paarweisen addition und geben Sie einen neuen Vektor, richtig? += soll mit +, aber die Zugabe im Ort.
  • 5 Jahre später... Dies ist ein Beispiel von "heben". Sie möchten, heben Sie die ( + ) - operator in den vector-container. Es ist eine sehr schöne Sache zu tun zu können. In Haskell, zipwith würde die Funktion, die Sie suchen. Es dauert zwei Listen und Reißverschlüsse zusammen mit einer Funktion. Man könnte auch schreiben zipwith in C++.

Schreibe einen Kommentar