Ich habe eine ganze Tabelle in std::deque<record *>
gespeichert und ich muss dem Benutzer erlauben, die Tabelle für jede Spalte zu sortieren. Die Tabelle wird dem Benutzer in einem Listenfeldformat präsentiert.Wie man std :: map vergleichen kann, um mit mehreren Datentypen zu arbeiten?
Jeder Datensatz besteht aus mehreren Strings (Struct of Strings). Die Felder haben jedoch unterschiedliche Typen, d. H. Zeit (HH: MM: SS), Gleitkommazahl und Zeichenfolgen, obwohl sie alle als Zeichenfolgen gespeichert sind.
Der Benutzer darf eine dieser Spalten sortieren. Wenn der Benutzer auf die Spalte klickt, speichere ich jeden Datensatz in einer Multimap, so dass die Tabelle für den Benutzer in einem sortierten Format angezeigt wird.
Da die Spalten jedoch unterschiedliche Typen haben, wie schreibe ich eine einzige Vergleichsmethode, die all diese effizient behandelt?
Ich dachte an die folgenden Arten
- Verwenden Sie verschiedene Karten für jeden Typ und schreiben eine Funktionsklasse für jede der Karten vergleichen.
- Verwenden Sie eine einzelne Map mit einer Vergleichsklasse, die alle drei verschiedenen Typen behandelt. Für jede Einfügung muss die Vergleichsklasse jedoch den Typ bestimmen und entsprechend einfügen.
Gibt es einen besseren Weg als diese beiden?
Beispiel:
struct ltDataCompare
{
bool operator()(const CString& csData1, const CString& csData2) const
{
if (isTimeFormat(csData1) && isTimeFormat(csData1))
{
// Do time relevant comparision
}
else if (isNumberFormat(csTime1) && isNumberFormat(csTime2))
{
double dPrice1 = atof((LPCTSTR)csTime1);
double dPrice2 = atof((LPCTSTR)csTime2);
return (dPrice1 < dPrice2);
}
return (csTime1 < csTime2);
}
};
std::multimap<CString,list_record_t*,ltDataCompare> _mapAllRecords; // Used only for sorting
Was vergleichen Sie? Ist es sinnvoll, beispielsweise einen Float mit einem String zu vergleichen? Edit: Entschuldigung, ich verstehe was du meinst. Sie möchten nach einem oder mehreren Feldern im Datensatz sortieren. Nun, Sie können das mit einer Feldaufzählung machen, die Sie in Ihre Sortierfunktion (oder Lambda) übergeben, und dann den entsprechenden Wert in der Vergleichsfunktion in Abhängigkeit vom Aufzählungswert verwenden. – Robinson
Könnten Sie bitte ein Beispiel Robinson zeigen? – user373215
Robinson, alle Felder sind als Strings gespeichert. Ich muss den Typ des Feldes bestimmen und entsprechende Sortierung/Vergleich durchführen. – user373215