2016-06-14 8 views
-4

Ich habe folgende Strings: 1465883175,476876 RX 0x03 0x00000000Wie gebe ich die Zeichenfolge ein, um den Container zu sortieren?

1465883175,606049 RX 0x00 0x00000000

1465883175,783562 RX 0x02 0x00000000

1465883175,906900 RX 0x03 0x00000000

1465883176,051490 RX 0x00 0x00000000

1465883176,201903 RX 0x03 0x00000000

Wie kann ich sie in einen Container eingeben, der sie nach den ersten Daten vom Typ double (C++) sortiert?

Ich muss es auf die effektivste Art und Weise tun.

Ich überlege, std :: set container zu verwenden, aber in diesem Container können keine zwei Elemente im Container einen gleichwertigen Schlüssel haben. In jedem Fall enthalten die Strings möglicherweise dieselbe Nummer.

+1

Als Pop-Out-Box Staaten auf der rechten Hand, wenn Sie eine Frage stellen: * Geben Sie Details . Teilen Sie Ihre Forschung. * –

+0

Sie könnten sie in einen 'std :: vector' als Zeichenfolgen setzen und [' std :: sort'] (http://en.cppreference.com/w/cpp/algorithm/sort) mit verwenden Ihre eigene Vergleichsfunktion, die das Doppelte analysiert und vergleicht. Oder Sie könnten eine Struktur mit den analysierten Felder verwenden, und diejenigen, die in einem Vektor setzen, so dass Sie die Doppel nicht für jeden Vergleich analysieren müssen. –

+0

@ Karsten Koop- was ist mit der Priority Queue? –

Antwort

0
#include <string> 
#include <vector> 
#include <algorithm> 
#include <iostream> 
#include <queue> 

int main() { 
    std::vector<std::string> s{ 
    "1465883175.476876 RX 0x03 0x00000000" 
    ,"1465883175.606049 RX 0x00 0x00000000" 
    ,"1465883175.783562 RX 0x02 0x00000000" 
    ,"1465883175.906900 RX 0x03 0x00000000" 
    ,"1465883176.051490 RX 0x00 0x00000000" 
    ,"1465883176.201903 RX 0x03 0x00000000"}; 

    auto cmp = [](const std::string &f, const std::string &s) { 
    double n1 = 0.0; 
    size_t processed1{0}; 
    auto sub_str1 = f.substr(0, f.find(" ")); 
    try { 
     n1 = std::stod(sub_str1, &processed1); 
     if (processed1 != sub_str1.size()) { 
     // TODO 
     } 
    } catch (std::invalid_argument ia) { 
     // TODO 
    } catch (std::out_of_range oor) { 
     // TODO 
    } 

    double n2 = 0.0; 
    size_t processed2{0}; 
    auto sub_str2 = s.substr(0, s.find(" ")); 
    try { 
     n2 = std::stod(sub_str2, &processed2); 
     if (processed2 != sub_str2.size()) { 
     // TODO 
     } 
    } catch (std::invalid_argument ia) { 
     // TODO 
    } catch (std::out_of_range oor) { 
     // TODO 
    } 

    return n1 > n2; 
    }; 

    std::priority_queue<std::string, std::vector<std::string>, decltype(cmp)> q(cmp); 

    for (const auto &c : s) { 
    q.push(c); 
    } 
    while (!q.empty()) { 
    std::cout << q.top() << "\n"; 
    q.pop(); 
    } 
    return 0; 
} 
+0

Die Prioritätswarteschlange sollte keinen Schlüssel für soritinh haben? Ich meine, kann ich ihm nicht den Schlüssel geben, und er sollte es automatisch mit Sortieren sortieren? –

+0

Die Prioritätswarteschlange benötigt eine Vergleichsfunktion (cmp im Code), eine priority_queue ähnelt der Verwaltung eines Heaps in einem beliebigen Zugriffscontainer, mit dem Vorteil, den Heapspeicher nicht versehentlich ungültig zu machen ... http: // en .cppreference.com/w/CPP/Behälter/priority_queue –

+0

Ok, so gibt es einen Behälter, der einen dpecific Schlüssel erhalten und nach Sortieren dieser Taste (in diesem Fall der Anzahl)? –

0

Versuchen Sie diesen Code mit C++ 11 Compiler-Unterstützung (Sie benötigen verbessern diese):

#include <string> 
#include <vector> 
#include <algorithm> 
#include <iostream> 

int main() { 
    std::vector<std::string> s{ 
    "1465883175.476876 RX 0x03 0x00000000" 
    ,"1465883175.606049 RX 0x00 0x00000000" 
    ,"1465883175.783562 RX 0x02 0x00000000" 
    ,"1465883175.906900 RX 0x03 0x00000000" 
    ,"1465883176.051490 RX 0x00 0x00000000" 
    ,"1465883176.201903 RX 0x03 0x00000000"}; 

    std::sort(s.begin(), s.end(), [](const std::string &f, const std::string &s){ 
    double n1 = 0.0; 
    size_t processed1{0}; 
    auto sub_str1 = f.substr(0, f.find(" ")); 
    try { 
     n1 = std::stod(sub_str1, &processed1); 
     if (processed1 != sub_str1.size()) { 
     // TODO 
     } 
    } catch (std::invalid_argument ia) { 
     // TODO 
    } catch (std::out_of_range oor) { 
     // TODO 
    } 

    double n2 = 0.0; 
    size_t processed2{0}; 
    auto sub_str2 = s.substr(0, s.find(" ")); 
    try { 
     n2 = std::stod(sub_str2, &processed2); 
     if (processed2 != sub_str2.size()) { 
     // TODO 
     } 
    } catch (std::invalid_argument ia) { 
     // TODO 
    } catch (std::out_of_range oor) { 
     // TODO 
    } 

    return n1 < n2; 
    }); 
    for (const auto &c : s) { 
    std::cout << c << "\n"; 
    } 
    return 0; 
} 
+0

https://ideone.com/usorzl –

+0

Der Zweck ist es, die Elemente des Vektors in einen Container einzufügen, die sie durch Sortieren einfügen. –

+0

Das relevante ist das Lamda, also benutze dieses in einer Prioritätswarteschlange. siehe ein Beispiel. –