2016-10-07 11 views
1

ich ziemlich neu in C bin ++ und will einfach nur testen, wie schnell C++ kann folgenden Job:Verbesserung meines Codes

Erstellen Sie einfach einen Vektor mit 100 ObjectC von Object-Punkt (x, y-Koordinaten) und verschiebe es in einen anderen Vektor. Wiederholen Sie dies k-mal. (In diesem Code ist es 1000000-mal - int Iterator).

Nun, da ich sehr neu in C++ bin, sehen Sie einen besseren Weg, es zu tun, oder habe ich etwas vermisst?

Im läuft auf Windows.

#include "Main.h" 
#include "Point.h" 
#include <iostream> 
#include <vector> 
#include <chrono> 


int main() { 
    auto start = std::chrono::high_resolution_clock::now(); 
    int Constant = 10; 
    int Iterator = 1000000; 

    std::vector<Point>* tour = new std::vector<Point>(); 
    std::vector<Point>* actions = new std::vector<Point>(); 

    for (int k=0; k<Iterator; k++) { 

     for (int i=0; i<Constant; i++) { 
      for (int j=0; j<Constant; j++) { 
       Point *p = new Point((i * 10) + j,i + 1, j + 1); 
       actions->push_back(*p); 
      } 
     } 

     while(!actions->empty()) { 
      tour->push_back(actions->at(0)); 
      actions->erase(actions->begin()); 
     } 

     actions->clear(); 
     tour->clear(); 
    } 

    auto finish = std::chrono::high_resolution_clock::now(); 
    std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(finish-start).count() << std::endl; 
} 
+0

das Programm funktioniert? Tut es, was Sie wollen? Dann brauchst du nur noch [Code-Review] (http://codereview.stackexchange.com/tour). –

+2

Wenn Sie den Arbeitscode verbessern möchten, stellen Sie diese Frage besser unter [SE Code Review] (http://codereview.stackexchange.com/). –

+0

zusätzliche Informationen des Auftrags: Erstellen Sie einen Vektor von 100 Objekten mit x, y-Koordinaten + ID und verschieben Sie es in einen anderen Vektor, indem Sie die Objekte in inkrementeller Indexreihenfolge hinzufügen und die Objekte im Ursprungsvektor löschen – kxell2001

Antwort

3

Betrachten Sie die Vektor-Instanzen auf dem Stapel Zuweisung, nicht auf dem Heap, zB:

std::vector<Point>* tour = new std::vector<Point>(); 
std::vector<Point>* actions = new std::vector<Point>(); 

nur wird:

// std::vector default constructor creates empty vectors. 
std::vector<Point> tour; 
std::vector<Point> actions; 

Ähnlich tun nicht unnötig ineff iciently verteilen Point s auf dem Haufen!

Point *p = new Point((i * 10) + j,i + 1, j + 1); 
actions->push_back(*p); 

Nur etwas tun viel einfacher und effizienter zu gestalten, wie:

actions.push_back(Point{x, y, z}); 

Darüber hinaus können Sie von einem Vektor zum anderen kopieren Sie einfach operator= überlastet mit:

destVector = sourceVector; 

Gemäß Ihrem zusätzlichen Kommentar, wenn Sie möchten bewegen Inhalt von einem Vektor zu einem anderen, können Sie std::move(), zB:

// Data moved from sourceVector to destVector. 
// Leaves sourceVector empty. 
destVector = std::move(sourceVector); 

Darüber hinaus, wenn Sie kompilieren-Zeitkonstanten, können Sie constexpr:

constexpr int Constant = 10; 
constexpr int Iterator = 1000000; 
+0

Thnx für die schnelle Antwort. Das hat mir sehr geholfen. Ja, ich habe vergessen zu erwähnen, dass ich einfach keine Kopie eines Vektors möchte. Außerdem möchte ich nur die Objekte Schritt für Schritt in einen anderen Vektor verschieben. Das hat etwas mit einem anderen Problem zu tun. – kxell2001

+0

@ kxell2001: Gern geschehen. Freut mich, Ihnen behilflich zu sein. –

+0

@ kxell2001 - Wenn Sie alle Elemente von einem Vektor in einen anderen verschieben möchten, können Sie 'destVector = std :: move (sourceVector);'. Dies beinhaltet kein Kopieren. –

1

Ich denke, die größte Verlangsamen Sie in Ihrem Code die Tatsache, dass Sie von der Vorderseite eines Vektors löschen. Wenn Sie dies tun, bewegt es jedes andere Element um eine Position nach oben. Wenn Sie dies viele Male tun, werden Sie sehen, dass Sie eine Menge Rechenleistung verschwenden.

Also kopieren Sie einfach den Vektor.

while(!actions->empty()) { 
    tour->push_back(actions->at(0)); 
    actions->erase(actions->begin()); 
} 

wird

tour = actions; 
+0

Wenn Sie die Elemente wirklich einzeln von einem Vektor zum anderen verschieben möchten, tun Sie dies entweder in einer Schleife ohne die Löschungen. Wenn Sie auf die Löschvorgänge bestehen, kehren Sie zuerst den Aktionsvektor um. Als Ergebnis werden Sie von der Rückseite des Vektors löschen, was eine viel effizientere Operation ist. –

Verwandte Themen