Ich versuche, eine „spärliche“ Vektor-Klasse in C++ zu erstellen, etwa so:Overloading operator [] für einen spärlichen Vektor
template<typename V, V Default>
class SparseVector {
...
}
Intern wird es durch ein std::map<int, V>
dargestellt werden (wobei V
das ist Art des gespeicherten Wertes). Wenn ein Element in der Map nicht vorhanden ist, werden wir so tun, als sei es gleich dem Wert Default
aus dem Template-Argument.
Ich habe jedoch Probleme beim Überladen des tiefgestellten Operators, []
. Ich muss den []
-Operator überladen, da ich Objekte aus dieser Klasse in eine Boost-Funktion übergebe, die erwartet, dass []
ordnungsgemäß funktioniert.
Die Version const
ist einfach genug: Überprüfen Sie, ob der Index in der Karte ist, geben Sie den Wert zurück, falls dies der Fall ist, oder andernfalls Default
.
Allerdings erfordert die nicht-const Version, dass ich eine Referenz zurückgebe, und das ist, wo ich in Schwierigkeiten komme. Wenn der Wert nur lautet, lesen Sie, ich brauche (noch will) nichts zur Karte hinzufügen; aber wenn es geschrieben ist, muss ich möglicherweise einen neuen Eintrag in die Karte einfügen. Das Problem ist, dass der überladene []
nicht weiß, ob ein Wert gelesen oder geschrieben ist. Es gibt nur eine Referenz zurück.
Gibt es eine Möglichkeit, dieses Problem zu lösen? Oder vielleicht um es zu umgehen?
boost :: mapped_vector <> sollte etwas ähnliches tun - Sie können es für Ideen studieren (oder vielleicht einfach verwenden). –
Es unterstützt meine Standardwerte nicht, und ich wollte dies auch für eine zweidimensionale Matrix tun, so dass es direkt nicht in Frage kommt. Aber immer noch eine nützliche Referenz! – Thomas