2012-04-10 21 views
2

Was ist der schnellste Weg, um einen großen STL-Container zu "löschen"? In meiner Anwendung muss ich mit großen std::map, z. B. 10000 Elemente beschäftigen.C++ STL-Container :: clear :: swap

Ich habe die folgenden 3 Methoden getestet, um eine std::map zu löschen.

  • Erstellen Sie einen neuen Container jedes Mal, wenn ich es brauche.
  • Aufruf map::clear() Methode.
  • Aufruf map::swap() Methode.

Es scheint, dass ::swap() das beste Ergebnis gibt. Kann mir bitte jemand erklären, warum das so ist? Ist es sicher zu sagen, dass die Methode map::swap() die richtige Methode ist, eine std :: map zu "löschen"? Ist es das gleiche für andere STL-Container, zum Beispiel set, vector, list usw.

m_timer_start = boost::posix_time::microsec_clock::local_time(); 

// test_map.clear(); 
    test_map.swap(test_map2); 
    for (int i = 0; i< 30000; i++){ 
     test_map.insert(std::pair<int, int>(i, i)); 
    }  

// std::map<int, int> test_map_new; 
// for (int i = 0; i< 30000; i++){ 
//  test_map_new.insert(std::pair<int, int>(i, i)); 
// }  

    m_timer_end = boost::posix_time::microsec_clock::local_time(); 
    std::cout << timer_diff(m_timer_start, m_timer_end).fractional_seconds() << std::endl; // microsecond 
+3

"Fastest" ist fast immer implementierungsabhängig. – ildjarn

+1

Wie groß war der Unterschied zwischen den dreien? Wenn es nicht viel ist, würde ich sagen, klar wäre am besten lesbar. – chris

+1

Wie benutzen Sie 'std :: swap' und wie bewerten Sie das? –

Antwort

7

Sie sind nicht richtig Testen der swap Fall. Sie müssen für die Swap-to-Karte zerstört werden, um die ganze Zeit zu berücksichtigen. Versuchen Sie eine der folgenden Optionen:

{ std::map<something, something_else> test_map2; 
test_map.swap(test_map2); 
} // test_map2 gets destroyed at the closing brace. 

oder

// temporary gets destroyed at the semi-colon 
std::map<int, int>().swap(test_map); 
2

Sind Sie fragen, weil Sie ein Leistungsproblem mit und Sie haben festgestellt, dass Ihr Programm zu viel Zeit clearing Ihre Karten? Wenn Sie dies nicht getan haben, verwenden Sie einfach map :: clear() oder erstellen Sie jedes Mal neue lokale Variablen, je nachdem, was am natürlichsten und direktesten für Ihr Programm ist. Der Tauschtrick ist eine Optimierung und es hat wenig Sinn, Zeit zu verschwenden, es sei denn, Sie sind sicher, dass Sie dies aufgrund von Erfahrung tun müssen.

Wenn Sie ein Leistungsproblem erkannt haben, haben Sie bereits das Tool, um zu bestimmen, welche Ihrer Methoden es am besten anspricht.

+0

Gute Antwort. Es gibt jedoch keinen "Tauschtrick": siehe Robs Antwort. –

+0

Ich denke, die "Swap-Trick" -Optimierung bedeutet in der Regel Swapping statt Zuweisen (Kopieren), wenn der Inhalt des Containers, von dem die Daten kommen, danach irrelevant ist. Allerdings wird dieser Trick in C++ 11 meist durch 'std :: move' ersetzt. –