Frage

Wie würden Sie dieses Problem lösen? (Am Anfang ist es einfach schien, dann fand ich es verwirrend sein).

  • Sie haben eine Klasse namens Executor. Angenommen, Sie haben viel Instanz davon haben und sie verschiedene Dinge tun, bei Aufruf einer Methode tun (Argument).
  • Argument hat 2 verschiedene Parameter und sie sind A * pa, pb B * (von denen eine Null sein kann)
  • Nun, ich möchte eine Klasse-Manager, der Argument ntfernungen empfängt und leitet sie an die entsprechende Instanz von Executor (lassen Sie uns diese Methode Filter nennen). Dies wird nach getan, einige Zeit vor, die so genannte jeder Executor die Manager.subscribe (A * pa, B * pb) -Methode man wich zu sagen davon interessiert. Beachten Sie, dass: wenn pa oder (nicht beide) pb NULL sind, bedeutet ANY (ich meine, wenn pa NULL ist, nur pb aktiviert ist). Natürlich muss es nicht mehr als eine Executor sein.
  • Die Implementierung muss schnell sein, sollte die ideale ein Vektor sein, oder etwas in der Nähe wie eine Hash-Karte ... aber der Vergleich muss auf DEN INHALT pa und pb ERFOLGEN, nicht ihren Wert als Zeiger.
  • Schließlich muss es möglich sein, dass Abonnement kann durch einen Testamentsvollstrecker storniert werden (ohne zu lange warten). Auf jeden Fall möchte ich, dass Filter, abonnieren und cancelSubscription sind sehr schnell.

Ich habe von vielen Anordnungen gedacht, mit Hash-Karten, Listen und multimaps ... Aber alle von ihnen fehlt Geschwindigkeit oder Leichtigkeit, oder etwas anderes. Was würden Sie tun?

War es hilfreich?

Lösung

Ich denke, Sie eine Klasse erstellen möchten als „Abonnement“, die von einem Executor zu einem Manager mit Informationen über, unter welchen Bedingungen die dieses Abonnement auslösen würde, sowie eine Art von GUID oder den Namen für dieses Abonnement ein einziges Abonnement darstellt . Ich denke, so etwas wie

 class Subscription
 {
   GUID g;
   A_filter a;
   B_filter b;
   Executor *e;
 }

subcription wäre auch eine Methode zu „prüfen“, wenn es auf gegebene Werten für A und B basierend auslösen soll und dann auf diesen Parametern die Testamentsvollstrecker nennen, wenn sie paßt.

Die Klasse Manager würde dann drei Karten enthalten, eine dieser Karten Guid * Subscription und erlauben würde, sehr schnell unsubcribes, im Grunde die GUID in der Abmeldeanfrag nachschlagen, um das Abonnement Objekt zu erhalten, verwenden, die bestimmen Objekt, was für Werte A und B müssen möglicherweise von der A-Karte und B Karte gelöscht werden, dann löschen Sie das Objekt. Abonnieren ist nur eine Frage der Schaffung der Abonnement-Objekt und das Hinzufügen von Werten zu dem Guid Karte, eine Karte und B.

einen Blick nach oben tun, basierend auf (A, B), wenn entweder A oder B null ist, können Sie sehen die in der anderen Hash-Tabelle und das Abonnement auslösen, der zurückgegeben wird. Wenn weder A noch B null sind, werden die Dinge komplizierter.

Hier wäre das, was zu tun, um eine Kreuzung auf den Sets durch Nachschlagen A und Nachschlagen b.Diese zurück finden kann manuell durchgeführt werden, aber eine raschere Methode könnte nur eine zusätzliche Karte zu haben, auf das der Schlüssel ist, B zu A angehängt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top